2016-12-13 12 views
1

Xcode 8.1、Swift 2.3、iOS 10.1、Firebaseを使用スウィフト - 失われたデータ

私は閉鎖外のデータにアクセスしていません。私は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とdownloadURL2の値をダウンロードできないと言っていますか?

そうなら、それは完全に正常です。あなたはむしろ閉鎖の外に変数を宣言する必要があります。しかし、非同期であるため、これらの2つの変数の値をクロージャの外側で使用しようとすると機能しません。

したがって、その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または何らかの

関連する問題