2016-06-27 2 views
2

Firebase를 사용하는 iOS 응용 프로그램을 만들고 있습니다. 그러나 내 응용 프로그램의 특정 지점에서 사용자가 데이터베이스에 게시물을 업로드하면이 게시물에는 사용자가 업로드 한 사진의 Firebase 저장소 URL이 있어야합니다 . 이러한 모든 작업은 한 번에 완료되므로 URL의 사전 값에 대해 nil 값을 얻게됩니다. 프로세스가 비동기이며 한 번에 완료되므로 업로드라고하는 한 함수에서입니다. 그래서 다음 URL 값을 얻을 않는 방법 전무 값을 즉 충돌 여기Swift의 비동기 NSOperation 종속성

var queue = NSOperationQueue() 

     let uploadToStorageOperation = NSBlockOperation(block: { 

      eventImagesRef.putData(self.imageData!, metadata: metadata).observeStatus(.Success) { (snapshot) in 

      let downloadTxt = snapshot.metadata!.downloadURL()!.absoluteString 

      self.downloadURL = downloadTxt 
      print(self.downloadURL) 
      } 
    }) 


     /*uploadToStorageOperation.setCompletionBlock{(
      if downloadURL != nil { queue.addOperation(uploadEventOperation) } 
     })*/ 


     let uploadEventOperation = NSBlockOperation(block: { 

      let key = self.ref.child("events").childByAutoId().key 
      let event: [String: AnyObject] = ["eventID": eventID, 
         "host": host!, 
         "eventDescription": self.eventDescription.text!, 
         "location": [ "latitude": self.latitude, "longitude": self.longitude], 
         "eventPhotoURL": self.downloadURL! //error is here nil value 

      ] 
      let childUpdates = ["/events/\(key)": event, 
           "/user-events/\(host!)/\(key)": event] 
      self.ref.updateChildValues(childUpdates) 

     }) 

     uploadEventOperation.addDependency(uploadToStorageOperation) 


     queue.maxConcurrentOperationCount = 1 
     queue.addOperations([uploadToStorageOperation,uploadEventOperation], waitUntilFinished: false) 
+0

왜 NSOperationQueue를 사용하고 있습니까? –

답변

1

을받지 않고 다른 작업에 게시하는 것은 내가 무슨 일이 일어나고 의심 무엇 :

귀하의 첫 번째 uploadToStorageOperation는 블록을 실행하는 자체 통화 완성 블록을 가진 비동기 방법 (eventImagesRef.putData()). downloadURL 속성은이 완료 블록 내부에서 설정됩니다.

두 번째 uploadEventOperationdownloadURL 속성에 액세스하려는 블록을 실행합니다. uploadEventOperationuploadToStorageOperation 완료 후에 만 ​​실행하도록 구성했습니다. 그러나 uploadToStorageOperation을 완료하기 전에 자체 블록 내에서 호출하는 비동기 메서드가 완료되고 전에 앞에 downloadURL을 설정하는 완료 블록이 실행됩니다. 비동기

  • uploadToStorageOperation 반환라고

  • eventImagesRef.putData()을 실행하고

  • "완료"되어

    • uploadToStorageOperation : 즉

      는, 타임 라인은 다음과 같이 보입니다 uploadEventOperation exec 이 비동기 적으로 완료

    • eventImagesRef.putData() 전무이며이 있습니다

    설정

  • downloadURL의 완료 블록 호출 있도록

  • downloadURL 액세스 uted

    는 값이 설정되어 있지 않은 이 작업을 수행하는 방법의 수, 예를 들어 저장 작업에 대해 NSOperation의 서브 클래 싱 eventImagesRef.putData() 비동기 호출이 완료된 후에 만 ​​완료됩니다. 또는 uploadToStorageOperation 블록 안에 디스패치 세마포를 사용하여 블록이 반환되기 전에 해당 스레드가 eventImagesRef.putData() 메서드가 완료 될 때까지 대기하도록 할 수 있습니다.

    어떤 경우에도 키가 실현되는 것은 블록이있는 NSOperation이 완료 되었기 때문에 해당 블록에서 시작된 비동기 작업도 완료되었음을 의미하지는 않습니다.

  • +0

    감사합니다. 또한 약속을 사용하려고합니다. –