2017-03-17 52 views
1

我已採取https://www.weheartswift.com/firebase-101/的原始代碼並進行編輯以適合我的需要。swift var不會在塊之外更新

在這個視圖控制器我更新一個圖像,然後,我用一個按鈕執行unwind segue和另一個視圖控制器調用函數updateValues並將數據存儲在firebase中。

什麼不工作是updateValues功能,但僅適用於taskImg值,其他(taskTitle和taskLat和taskLon完美的作品)

我認爲它不會更新,因爲它的這個代碼塊

#裏面
self.storageRef.child(filePath).put(data as Data, metadata: metaData).observe(.success) { (snapshot) in 


self.downloadURL = snapshot.metadata!.downloadURL()!.absoluteString 

      completion() 

} 

,因爲如果我嘗試任何var值從裏面改什麼也沒有發生,該塊它的工作原理之外,但obiouvsly我可以,因爲我沒有動態地生成它...

有人可以幫我嗎?

func editImage(completion: @escaping callback){ 



    let resizedImage = resizeImage(image: imagePicked.image!, newWidth: 200) 

    var data = NSData() 
    // data = UIImageJPEGRepresentation(imagePicked.image!, 0.1)! as NSData 
    data = UIImageJPEGRepresentation(resizedImage!, 0.1)! as NSData 





    let filePath = "\(FIRAuth.auth()!.currentUser!.uid)/Pictures/\(NSUUID().uuidString)" 
    let metaData = FIRStorageMetadata() 

    //store downloadURL 
    metaData.contentType = "image/jpg" 
    self.storageRef.child(filePath).put(data as Data, metadata: metaData).observe(.success) { (snapshot) in 



     //progress upload 
     self.storageRef.child(filePath).put(data as Data, metadata: metaData).observe(.progress) { snapshot in 
      // Upload reported progress 
      if let progress = snapshot.progress { 
       let percentComplete = 100.0 * Double(progress.completedUnitCount)/Double(progress.totalUnitCount) 
       print("percent \(percentComplete)") 
      } 
     } 
     self.storageRef.child(filePath).put(data as Data, metadata: metaData).observe(.success) { snapshot in 
      // Upload completed successfully 
      print("success") 
     } 

     self.storageRef.child(filePath).put(data as Data, metadata: metaData).observe(.failure) { snapshot in 

      print(snapshot.error?.localizedDescription ?? "") 
     } 


     self.downloadURL = snapshot.metadata!.downloadURL()!.absoluteString 

     completion() 

     print(self.taskImg,"\"inside editImage function, right value") 


    } 


} 



func updateValues() { 
    self.taskTitle = self.titleField.text 
    if tapped == true { 
     self.taskLat = latitude 
     self.taskLon = longitude 
    }else{ 
     //doesn't update location 
    } 
    self.taskCompleted = self.completedSwitch.isOn 

    if tappedpicture == true { 

     editImage { self.taskImg = self.downloadURL 
      print (self.downloadURL,"\"inside updateValues function, right value") 

        } 

     print (self.taskImg,"\"this is where i need it and it's wrong value") 


    }else{ 
     //doesn't update location 
    } 



} 
+1

什麼是self.taskImg的類型?請提供課程定義。 – iphaaw

+0

self.taskImg的類型是字符串 – HaVaNa7

+0

您應該將該塊視爲一個單獨的函數,在聲明的打印範圍超出範圍之後,在稍後的運行循環中調用該塊。我猜如果你在你的打印行上放置一個斷點,然後在你的任務上放置一個斷點(例如'self.taskImg = downloadURL'),你會看到'print'被首先調用。如果您在塊內分配後立即調用print,則會看到使用更新的值調用它。一旦它具有正確的值,你想用'taskImg'變量做什麼? –

回答

1

我的猜測是,在將數據操作完成並self.downloadURL沒有設置在讀取由其他視圖控制器的時間之前發生開卷SEGUE。

要檢查這一點,您可以在put completion block中設置一個斷點,並在目標segue中設置一個斷點。

+0

非常感謝Andrei,我照你說的做了,是的,展開之前發生,我怎麼能改變它? – HaVaNa7

+1

我認爲最簡單的方法可以在self.downloadURL設置爲正確的值後調用unwind segue。 –

+0

是的是的這是答案!謝啦!! – HaVaNa7