2016-07-24 3 views
-1

У меня проблема с Firebase SDK для iOS в swift 2. Я пытаюсь установить изображение для загрузки из хранилища Firebase. Когда я вызываю функцию, она возвращает нуль. Я думаю, что это связано с тем, что задача загрузки, предоставленная Firebase sdk, является асинхронной, поэтому, когда подразумевается возвращаемое состояние, называется нужный uid, который не требуется, потому что Задача не завершена. Как я могу решить это, чтобы получить правильную картинку?swift Firebase return in asynchron Задача

override func viewDidLoad() { 
    super.viewDidLoad() 
    imageView.image = downloadProfilePicFirebase() 
} 

Firebase функция загрузки:

func downloadProfilePicFirebase() -> UIImage{ 

    print("download called") 

    //local paths 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
    let documentDirectorPath:String = paths[0] 
    let imagesDirectoryPath = documentDirectorPath.stringByAppendingString("/profiles") 

    var uid = String() 


    if let user = FIRAuth.auth()?.currentUser { 
     let uid = user.uid 

     let storageRef = FIRStorage.storage().referenceForURL("gs://myid.appspot.com") 
     let profilePicRef = storageRef.child("/profile_pic.jpg") 

     let homeDir: NSURL = NSURL.fileURLWithPath(NSHomeDirectory()) 
     let fileURL: NSURL = homeDir.URLByAppendingPathComponent("Documents").URLByAppendingPathComponent("profiles").URLByAppendingPathComponent("profile_pic").URLByAppendingPathExtension("jpg") 

     // Download to the local filesystem 
     let downloadTask = profilePicRef.writeToFile(fileURL) { (URL, error) -> Void in 
      if (error != nil) { 
       print(error) 
      } else { 
       // svaed localy now put in ImageView 
      } 
     } 
    } 
    return UIImage(contentsOfFile: "\(imagesDirectoryPath)"+"/profile_pic_user_"+uid+".jpg")! 
} 
+0

См. этот [ответ] (http://stackoverflow.com/a/38439609/5654848). – Dershowitz123

+0

@ Dershowitz123 да, но возвращаемое состояние будет вызвано до завершения. Я хочу сохранить функцию в этой точке. –

+0

Также см. Этот вопрос, и ответ, на который я ссылаюсь: http://stackoverflow.com/questions/38547875/how -в-вводного obverveeventtype-в-основной-нить –

ответ

3

Firebase является асинхронным, как вы упомянули, так пусть управлять потоком данных в вашем приложении.

Не пытайтесь вернуть данные из блока Firebase - пусть блок обрабатывает возвращаемые данные, а затем перейдет к следующему шагу, как только данные будут действительны в блоке.

Там есть несколько вариантов:

Один из вариантов, чтобы заполнить данные из завершения обработчика .writeToFile

override func viewDidLoad() { 
    super.viewDidLoad() 
    downloadPic() 
} 

func downloadPic { 
    let download = profilePicRef.writeToFile(localURL) { (URL, error) -> Void in 
     if (error != nil) { 
     // handle an error 
     } else { 
     imageView.image = UIImage(... 
     //then update your tableview, start a segue, or whatever the next step is 
     } 
    } 
} 

Второй вариант добавить наблюдателя в узел, и когда это закончится, заселить ваше изображениеПросмотр

override func viewDidLoad() { 
    super.viewDidLoad() 

    let download = storageRef.child('your_url').writeToFile(localFile) 

    let observer = download.observeStatus(.Success) { (snapshot) -> Void in 
    imageView.image = UIImage(... 
    //then update your tableview, start a segue, or whatever the next step is 
    } 
}