2016-09-03 3 views
1

В настоящее время я использую firebase для получения информации о пользователе. как только я получу данные, я хочу использовать данные за пределами закрытия, я создаю блок завершения, проблема в том, что я не могу добавить переменную завершения к результату, потому что результат находится внутри другого закрытия. Как решить эту проблему. Заранее спасибо за помощь.Обработчик Firebase и Completion

func userInfo(userId:String,completion:(result:String)->Void){ 


     fireBaseAPI().childRef("version_one/frontEnd/users/\(fireBaseAPI().currentUserId()!)/email").observeEventType(.Value, withBlock: {snapshot in 

      let email = snapshot.value as! String 

      //this is incorrect because it is inside a firebase closure how can I make it work I know i have it outside the closure but i will not be able to retrieve the info from firebase 
      result = email 

     }) 




    } 
+1

быть более ясно, что вы хотите, а также обеспечить больше информации относительно того, что 'fireBaseAPI() ' – Dravidian

ответ

3

Насколько я мог понять вашу проблему :: ---

Вы хотите отправить адрес электронной почты своего пользователя в completionBlock: раз восстановлена, но я до сих пор не имеют ни малейшего представления, что к fireBaseAPI() является: -

func userInfo(userId:String,completion:((result:String)->Void){ 
fireBaseAPI().childRef("version_one/frontEnd/users/\(fireBaseAPI().currentUserId()!)/email").observeEventType(.Value, withBlock: {snapshot in 

     let email = snapshot.value as! String 
     completion(result:email) 
    }) 
} 
1

Вы можете создать переменную в классе (за пределами закрытия), а затем сохранить snapshot.value результат в этой переменной, как это:

EDIT

var emailResult: String? 

func getUserEmail { 
    fireBaseAPI().child("version_one/frontEnd/users/\(fireBaseAPI().currentUserId()!)/email").observeEventType(.Value, withBlock: {snapshot in 
     let email = snapshot.value as! String 
     self.emailResult = email 
    }) 
} 
+0

, этот результат всегда будет возвращать ноль, потому что переменная установлена ​​внутри закрытия, поэтому я должен был сделать обработчик завершения – pprevalon

+0

Я только что отредактировал свой ответ. Я не знаю, как выглядит остальная часть вашего класса, но могли бы вы сделать что-то вроде того, что я написал выше? Почему вам нужно передать 'userId: String' в ваш исходный метод' userInfo', поскольку вы вызываете 'fireBaseAPI(). CurrentUserId()' для получения идентификатора пользователя? И почему вам нужно добавить обработчик завершения поверх закрытия Firebase 'withBlock'? – alexisSchreier

+2

Эй, iOSMoonSand. Это действительно гарантирует, что результат электронной почты доступен вне 'getUserEmail()'. Firebase загружает данные асинхронно, поэтому обратный вызов может быть вызван (много) позже. Даже «хуже»: Firebase будет продолжать синхронизировать данные, поэтому результат электронной почты может со временем меняться. Основная проблема с вашим кодом заключается в том, чтобы узнать **, когда ** доступен результат электронной почты и (что еще труднее), когда он обновляется. Вот почему подход Дравидиана с обратным вызовом (хотя и изначально менее интуитивным) более идиоматичен для этих вызовов. –