2016-03-28 9 views
1

私は次をしようとしている:私はAlamofireからの応答を取得前の操作を完了する前にNSOperationがなぜ起動するのですか?

  1. 、私はこのために、アレイに
  2. 印刷この配列

を埋める:

var queue = NSOperationQueue() 

let firstOperation = NSBlockOperation(block: { 
    let getMyProfileURL = "\(self.property.host)\(self.property.getMyProfile)" 
    Alamofire.request(.POST, getMyProfileURL, parameters: self.userParameters.profileParameteres, encoding: .JSON).responseJSON { response in 
     do { 
       let json = JSON(data: response.data!) 
       print(json) 

       if json["user"].count > 0 { 
        self.profileDetails.append(ProfileDetailsModel(json: json["user"])) 
       } 
      } 
     } 
}) 

firstOperation.completionBlock = { 
    print("firstOperation completed") 
} 

queue.addOperation(firstOperation) 

let secondOperation = NSBlockOperation(block: { 
    print(self.profileDetails) 
}) 

secondOperation.addDependency(firstOperation.completionBlock) 

secondOperation.completionBlock = { 
    print(self.profileDetails) 
} 

queue.addOperation(secondOperation) 

ので、理論では、最初に私の配列を埋める必要があり、この作業を完了し(ブロック)、直ちにそれらの配列を印刷します。しかし、私は得る:

firstOperation completed 
[] -> self.profileDetails from the secondOperation 
[] -> self.profileDetails from the secondOperation completion block 
and just here I get my JSON from the Alamofire 'do' block 

私は間違っていましたか?そして、私はそれが私が望むように動作するようにそれを修正することができますか?

+0

ブロックが返ってくると(操作が完了すると)リクエストが送信されるとすぐに、非同期呼び出しが戻ってくるのを待つことはありません。 – dan

+0

解決方法はありますか?私は@dan –

答えて

0

最初の操作が完了するまで(たとえば、最初の操作ブロックの最後まで)、2番目の操作を追加しないでください。

+0

を印刷し始める前に完全な配列を取得したいので、Alamofire終了後にこの行 'queue.addOperation(secondOperation)'を追加する必要がありますか? –

0

まず、Alamofire要求は常に別のスレッドで実行されることを理解する必要があります。

あなたのfirstOperationは役に立ちません。 Alamofireはすでに非同期であるため、必要ありません。

var queue = NSOperationQueue() 

let secondOperation = NSBlockOperation(block: { 
    print(self.profileDetails) 
}) 


secondOperation.completionBlock = { 
    print(self.profileDetails) 
} 

let getMyProfileURL = "\(self.property.host)\(self.property.getMyProfile)" 
Alamofire.request(.POST, getMyProfileURL, parameters: self.userParameters.profileParameteres, encoding: .JSON).responseJSON { response in 
    do { 
     let json = JSON(data: response.data!) 
     print(json) 

     if json["user"].count > 0 { 
      self.profileDetails.append(ProfileDetailsModel(json: json["user"])) 
     } 
    } 

    print("Alamofire.request completed") // instead of: print("firstOperation completed") 

    queue.addOperation(secondOperation) 
} 
関連する問題