2016-12-13 31 views
1

的Xcode 8.1,雨燕2.3,iOS的10.1,我用火力地堡斯威夫特 - Varible數據丟失

我不在外面封訪問數據。我想獲得downloadURL1和downloadURL2,就像self.url1 = downloadURL1

但是downloadURL1在關閉之外是零。

storageRef.child(filePath1).putData(data1, metadata: metaData) { (metadata1, error1) in 
      if let error = error1 { 
       print(error.localizedDescription) 
       return 
      } else { 
       let downloadURL1 = metadata1!.downloadURL()!.absoluteString     
      } 
     } 

     storageRef.child(filePath2).putData(data2, metadata: metaData) { (metadata2, error2) in 
      if let error = error2 { 
       print(error.localizedDescription) 
       return 
      } else { 
       let downloadURL2 = metadata2!.downloadURL()!.absoluteString 
      } 
     } 
+0

您在關閉中定義的變量,他們不再存在時,封閉結束以及他們不在外面...你需要一個類變量,例如 – Volker

回答

1

你說的裏面:

downloadURL1nil外關閉。

是的,這是有道理的,因爲這個閉包異步運行(即後來)。你只能在閉包中使用它(或者在閉包完成時從一些任務開始)。

例如,如果你想要做的,只有當他們都做了這兩個下載的東西,使用將派組:

var downloadURL1: String? 
var downloadURL2: String? 

let group = dispatch_group_create() 

dispatch_group_enter(group) 
storageRef.child(filePath1).putData(data1, metadata: metaData) { (metadata1, error1) in 
    defer { dispatch_group_leave(group) } 

    if let error = error1 { 
     print(error.localizedDescription) 
     return 
    } else { 
     downloadURL1 = metadata1!.downloadURL()!.absoluteString     
    } 
} 

dispatch_group_enter(group) 
storageRef.child(filePath2).putData(data2, metadata: metaData) { (metadata2, error2) in 
    defer { dispatch_group_leave(group) } 

    if let error = error2 { 
     print(error.localizedDescription) 
     return 
    } else { 
     downloadURL2 = metadata2!.downloadURL()!.absoluteString 
    } 
} 

dispatch_group_notify(group, dispatch_get_main_queue()) { 
    // you use `downloadURL1` and `downloadURL2` here 
} 

// but not here 
+0

這是工作!非常感謝 :) –

1

如果我明白了你的意思,你說你不能在你的關閉之外下載URL1並下載URL2的值?

那麼,如果是這樣,這是完全正常的。之前,您應該在閉包之外聲明您的變量。但試圖在閉包之外使用這兩個變量的值將不起作用,因爲它是異步的。

所以你可能也想使用他們的didSet屬性。但在這種情況下,爲什麼要使用downloadURL1和downloadURL2而不是直接做類似的事情?

var url1: String? { 
     didSet { 
      // Do whatever you want, like call a function, once url1 is set 
     } 
    } 
    var url2: String? { 
     didSet { 
      // Do whatever you want, like call a function, once url2 is set 
     } 
    } 

    storageRef.child(filePath1).putData(data1, metadata: metaData) { (metadata1, error1) in 
     if let error = error1 { 
      print(error.localizedDescription) 
      return 
     } else if let downloadURL1 = metadata1?.downloadURL()?.absoluteString { 
      // Just to make sure it isn't nil 
      self.url1 = downloadURL1     
     } 
    } 

    storageRef.child(filePath2).putData(data2, metadata: metaData) { (metadata2, error2) in 
     if let error = error2 { 
      print(error.localizedDescription) 
      return 
     } else if let downloadURL2 = metadata2?.downloadURL()?.absoluteString { 
      self.url2 = downloadURL2    
     } 
    } 

但也許我根本不理解你的問題?

編輯:我假設你使用這一切的viewController或一類某種