2016-03-28 15 views
1

Ich versuche, die nächste:Warum startet NSOperation vor dem Abschluss der vorherigen Operation?

  1. ich Antwort von Alamofire zu erhalten, füllen ein Array
  2. drucken Array

für das ich getan habe:

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) 

So, in der Theorie, zuerst muss es füllen mein Array, vervollständigen diese Aufgabe (Block) und nur später diese Array drucken. Aber ich bekomme:

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 

Also, was habe ich falsch gemacht? Und wie kann ich es reparieren, dass es funktioniert, wie ich will?

+0

Ihr Block kehrt zurück (und damit der Vorgang abgeschlossen), sobald die Anforderung erlischt, wird nicht auf einen asynchronen Aufruf gewartet. – dan

+0

Gibt es eine Lösung dafür? Ich möchte volle Array bekommen, bevor ich anfangen werde es zu drucken @dan –

Antwort

0

Fügen Sie die zweite Operation erst nach Abschluss der ersten Operation hinzu (z. B. am Ende des ersten Operationsblocks).

+0

Also muss ich diese Zeile 'queue.addOperation (secondOperation)' nach dem Alamofire-Abschluss hinzufügen? –

0

Zuerst müssen Sie verstehen, dass Alamofire Anfrage immer in einem separaten Thread durchgeführt wird.

So ist Ihr firstOperation nutzlos. Sie brauchen es nicht, weil Alamofire bereits asynchron ist.

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) 
}