2012-04-12 1 views
0

Я отправляю некоторые пользовательские объекты на сервер из приложения с ASIFormDataRequest внутри блока dispatch_async. И когда я получаю OK с сервера, мне нужно поместить объект в NSMutableArray. Но когда я пытаюсь получить доступ к массиву извне, этот блок пуст.Не удается добавить настраиваемый объект в NSMutableArray внутри блока

Мой код псевдокод, как это:

-(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); 

    } 

И в конце массива sendedObjects пуст. Я использую ARC, поэтому не могу сохранить. Кто-нибудь может мне помочь?

ответ

1

Ваш запрос может быть синхронным, но вы отправляете их из блоков, запланированных для одновременного выполнения. Это означает, что оператор NSLog может быть достигнут до отправки любого из ваших запросов. У вас есть два варианта решения проблемы:

  1. Не используйте dispatch_async и блоки, просто отправьте запросы inline. Я бы не рекомендовал это, если код, который вы показали, работает в основном потоке.
  2. Зарегистрируйте для завершения обратные вызовы и затем проверьте свой массив объектов. Вы можете увидеть, как это можно сделать here в разделе завершающего Callbacks

Кстати, прошлая форма отправить является отправлено.

+0

Я сделал это синхронно, и он нашел работу. Затем я увидел, что очередь отправки имеет приоритет по умолчанию, и происходит то, что вы сказали, что NSLog достигнут до блока. Thanx для грамматического урока, трудно, когда я работаю на 3 разных языках. – lagos