2016-08-06 57 views
0

Ich habe eine array von Benutzerobjekten. Ich muss über dieses Array iterieren, und dann muss ich für jeden Benutzer eine Anforderung zum Abrufen von Daten basierend auf seiner Benutzer-ID stellen. Diese Anfrage ist eine asynchrone Anfrage (und aus Gründen, die ich nicht synchronisieren kann). Hier ist die bearbeitete Code dispatch_group Anrufe:Gleichzeitigkeit iterieren über NSArray

EDITED

for (User *user in self.userList) { 
    dispatch_group_enter(self.usersGroup); 
    [self.wrapper getUserDataWithId:user.userid completion:^(Owner *owner, NSError *error) { 
     user.owner = owner; 
     dispatch_group_leave(self.usersGroup); 
    }]; 
} 

dispatch_group_notify(self.usersGroup, dispatch_get_main_queue(), ^{ 
    // All requests have finished 
    // Stuff with updated userlist 
}); 

Das Hauptproblem liegt auf der Hand: Wenn erste Anfragen abgeschlossen haben, verweisen die Benutzer es hat, ist nicht derjenige, der die Anfrage gestartet hat, so dass ich habe nicht die richtige Zuordnung.

Gibt es eine einfache und elegante Möglichkeit, dieses Problem zu lösen? Danke im Voraus!

+0

Der Block wird den Wert von 'user' erfassen, so wird der Besitzer auf dem richtigen Objekt eingestellt werden. Wie wartest du, bis alle Anfragen abgeschlossen sind? – Paulw11

+0

Der Block kennt nur eine ID (String), hat aber keinen Verweis auf das Benutzerobjekt. Ich habe versucht, mit dispatch_group, die wartet, bis alle Anforderungen abgeschlossen sind, aber zurückgegebenen Array hat keine korrelativen Daten –

+0

Hinzufügen des Codes, den Sie versucht mit Dispatch-Gruppen würde helfen Menschen helfen Ihnen. – CRD

Antwort

0

Wie @ Paulw11 vorgeschlagen, die Schleife wird nicht warten, bis Sie den Block ausführen, so dass ich vorschlagen, dass Sie rekursive Funktion wie diese anstelle von for Schleife verwenden.

- (void)getOwnerForObectAtIndex:(NSInteger)index { 
    if (index < self.userList) { 
     User *user = [self.userList objectAtIndex:index]; 
     [self.wrapper getUserDataWithId:user.userid completion:^(Owner *owner, NSError *error) { 
      user.owner = owner; 
      [self getOwnerForObectAtIndex:index+1]; 
     }]; 
    } 
    else { 
     //Now all User have its corresponding owner, Handle array Now. 
    } 
} 

Nun rufen Sie diese Funktion wie diese [self getOwnerForObectAtIndex:0];

+0

Ich habe versucht, mit dispatch_group, aber vielleicht eine rekursive Funktion ist eine bessere Lösung. Vielen Dank!! –

+0

Die OPs-Schleife wird beendet, nachdem für jedes Element eine asynchrone Task gestartet wurde. Ihre rekursive Lösung wird zurückgegeben, nachdem eine asynchrone Task für das erste Element gestartet wurde und keiner wartet, bis alle Tasks abgeschlossen sind. – CRD

+0

@CRD Nein, das wird funktionieren. Ich rufe meine Funktion erneut an, nachdem die Antwort richtig überprüft wurde. Block-Anweisung wird nur ausgeführt, wenn er Antworten erhält. –