2012-04-12 10 views
0

Ich sende einige benutzerdefinierte Objekte an einen Server von der App mit ASIFormDataRequest innerhalb eines Dispatch_async Block. Und wenn ich OK vom Server erhalte, muss ich das Objekt in ein NSMutableArray legen. Aber wenn ich versuche, von außen auf das Array zuzugreifen, ist der Block leer.Problem beim Hinzufügen eines benutzerdefinierten Objekts zu NSMutableArray in einem Block

Mein Code Pseudo-Code ist wie folgt:

-(void)sendObjects{ 
     NSMutableArray *sendedObjects = [NSMutableArray alloc]init]; 
     NSMutableArray *objectsToSend = [NSMutableArray alloc]init]; 

    for(ObjectSend *obj in objectsToSend){ 
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ 

      ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
      [request addRequestHeader:@"Content-Type" value:@"application/json"]; 
      [request appendPostData:[NSJSONSerialization dataWithJSONObject:sendDictWithObjects options:NSJSONWritingPrettyPrinted error:&error]]; 
      [request startSynchronous]; 
      NSError *requestError = [request error]; 
      if(!requestError){ 
       NSString *response = [request responseString]; 

       obj.sended = YES; 
       [sendedObjects addObject:s]; 

      } 

      }); 
     } 
     NSLog(@"%i",sendedObjects.count); 

    } 

Und am Ende der sendedObjects Array ist leer. Ich benutze ARC, kann also nicht behalten. Jemand kann mir helfen?

Antwort

1

Ihre Anforderung kann synchron sein, Sie senden sie jedoch aus den Blöcken, die für die gleichzeitige Ausführung geplant sind. Dies bedeutet, dass die NSLog-Anweisung erreicht werden kann, bevor eine Ihrer Anforderungen ausgelöst wird. Sie haben zwei Möglichkeiten, Ihr Problem zu beheben:

  1. Verwenden dispatch_async und blockiert nicht, einfach nur die Anfragen Inline senden. Ich würde das nicht empfehlen, wenn der Code, den du gezeigt hast, auf dem Hauptthread läuft.
  2. Registrieren Sie sich für Abschlussrückrufe und überprüfen Sie dann Ihr Array von Objekten. Sie können sehen, wie sich dies here bei der Fertigstellung Rückrufe Abschnitt

Durch die Art und Weise erfolgen, die Vergangenheitsform von senden ist gesendet.

+0

Ich habe es synchron und es funktioniert finden. Dann sah ich, dass die Dispatch-Warteschlange nur eine Standard-Priorität hatte, und es passiert, was Sie gesagt haben, dass der NSLog vor dem Block erreicht ist. Danke für die grammatische Lektion, schwierig, wenn ich in 3 verschiedenen Sprachen arbeite. – lagos