0

dispatch_asyncブロック内のASIFormDataRequestを使用して、アプリからサーバーにいくつかのカスタムオブジェクトを送信しています。サーバーからOKを受け取ったら、オブジェクトを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を使用しているので、保持できません。誰かが私を助けることができますか?

4

1 に答える 1

1

要求は同期的である可能性がありますが、同時実行がスケジュールされているブロックからそれらをディスパッチします。これは、リクエストがディスパッチされる前に NSLog ステートメントに到達できることを意味します。問題を解決するには、次の 2 つのオプションがあります。

  1. dispatch_async とブロックを使用しないでください。単にリクエストをインラインで送信してください。あなたが示したコードがメインスレッドで実行される場合、これはお勧めしません。
  2. 完了コールバックに登録し、オブジェクトの配列を確認してください。これがどのように行われるかは、完了コールバック セクションで確認できます。

ちなみにsendの過去形はsentです。

于 2012-04-12T12:15:18.653 に答える