2016-12-07 2 views
0

В настоящее время я пытаюсь настроить изображение профиля пользователя. У меня есть Пользователь, который загружает изображение в Firebase, но я хочу загрузить это изображение и кешировать его. У меня проблемы с загрузкой прямо сейчас, после того как я установлю это исправление, я буду беспокоиться о его кешировании.Загрузка изображения, затем Cache it from Firebase Swift 3

// Uploading Images to Firebase 
func uploadImageToFirebaseStorage(data: NSData) { 
    let storageRef = FIRStorage.storage().reference(withPath: "myPics/profilePic.jpg") 
    let uploadMetaData = FIRStorageMetadata() 
    uploadMetaData.contentType = "image/jpeg" 
    let uploadTask = storageRef.put(data as Data, metadata: uploadMetaData) { (metadata, error) in 
     if (error != nil) { 
      print("I Received an error \(error?.localizedDescription)") 
     } else { 
      print("Upload Complete! Here is the MetaData \(metadata?.downloadURL())") 
     } 

    } 

Теперь то, что у меня возникли проблемы с Навигатором Issue:

Issue Navigator

имеет этот вопрос на reference = self.storage. Заранее спасибо!

//Download Image for User Profile Picture 
func downloadImageUserFromFirebase() { 
    let storage = FIRStorage.storage() 
    var reference: FIRStorageReference! 
     reference = self.storage.referenceForURL("gs:URL.appspot.com") 
     reference.downloadURL { (url, error) in 
    let data = NSData(contentsOf: url!) 
    let image = UIImage(data: data! as Data) 
    self.profileImageView.image = image 
    } 
    } 

ответ

1

Хранение не было объявлено как свойство класса, оно было объявлено в рамках этого метода. Кроме того, даже если он был объявлен как свойство класса, в swift вам больше не нужно ставить себя перед свойством класса, если вы не находитесь в закрытии.

Либо сделать:

func downloadImageUserFromFirebase() { 
    let storage = FIRStorage.storage() 
    var reference: FIRStorageReference! 
    //all I did here was remove self before storage 
    reference = storage.referenceForURL("gs:URL.appspot.com") 
    reference.downloadURL { (url, error) in 
    let data = NSData(contentsOf: url!) 
    let image = UIImage(data: data! as Data) 
    self.profileImageView.image = image 
    } 
} 

Или, в идеале, реструктурировать код:

class ProfileViewController: UIViewController { 

    //here we are initializing it as a property of the class 
    let storage = FIRStorage.storage() 

    func downloadImageUserFromFirebase() { 
    var reference: FIRStorageReference = storage.referenceForURL("gs:URL.appspot.com") 
    reference.downloadURL { (url, error) in 
     //using a guard statement to unwrap the url and check for error 
     guard let imageURL = url, error == nil { 
     //handle error here if returned url is bad or there is error 
     return 
     } 
     guard let data = NSData(contentsOf: imageURL) else { 
     //same thing here, handle failed data download 
     return 
     } 
     let image = UIImage(data: data) 
     self.profileImageView.image = image 
    } 
    } 

} 
Смежные вопросы