2016-05-18 1 views
1

キューにメッセージを1つずつ送信したいとします。言い換えれば、私は以前の要求の応答を得た後、新しい要求を送る必要があります。私はdispatch_group_tAFNetworkingを使用します。しかし、期待通りに動作しません(私はoperationQueueと他の方法があることを知っています)。ここに私のコントローラは次のとおりです。dispatch_group_tを使用したAFNetworking要求のキュー

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    dispatch_async(queue, ^{ 
     [self sentTest]; 
    }); 
} 

- (void) sentTest{ 
    dispatch_group_t group = dispatch_group_create(); 
    NSLog(@"Start ..."); 
    for(int i = 1; i <= 10; i++) 
    { 
     dispatch_group_enter(group); 
     NSLog(@"sending message %d ...", i); 

     NSMutableDictionary *params = [@{@"param1":  @"value1", 
             @"param2":  @"value2", 
             } mutableCopy]; 
     NSString *webServiceUrl = @"MY_REST_SERVICE_URL"; 

     AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 
     manager.responseSerializer = [AFJSONResponseSerializer serializer]; 

     [manager POST:webServiceUrl parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { 
      NSLog(@"message sent successful %d", i); 
      dispatch_group_leave(group); 
     } failure:^(NSURLSessionDataTask *task, NSError *error) { 
      NSLog(@"message sent failure %d", i); 
      dispatch_group_leave(group); 
     }]; 

    } 
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 
    NSLog(@"Finished!"); 
} 

結果は以下の通りです:

2016-05-18 14:46:32.350 my_app[24514:29642637] Start ... 
2016-05-18 14:46:32.350 my_app[24514:29642637] sending message 1 ... 
2016-05-18 14:46:32.352 my_app[24514:29642637] sending message 2 ... 
2016-05-18 14:46:32.353 my_app[24514:29642637] sending message 3 ... 
2016-05-18 14:46:32.353 my_app[24514:29642637] sending message 4 ... 
2016-05-18 14:46:32.354 my_app[24514:29642637] sending message 5 ... 
2016-05-18 14:46:32.355 my_app[24514:29642637] sending message 6 ... 
2016-05-18 14:46:32.356 my_app[24514:29642637] sending message 7 ... 
2016-05-18 14:46:32.357 my_app[24514:29642637] sending message 8 ... 
2016-05-18 14:46:32.358 my_app[24514:29642637] sending message 9 ... 
2016-05-18 14:46:32.359 my_app[24514:29642637] sending message 10 ... 
2016-05-18 14:46:33.738 my_app[24514:29642545] message sent successful 1 
2016-05-18 14:46:34.818 my_app[24514:29642545] message sent successful 2 
2016-05-18 14:46:35.833 my_app[24514:29642545] message sent successful 8 
2016-05-18 14:46:36.955 my_app[24514:29642545] message sent successful 5 
2016-05-18 14:46:37.957 my_app[24514:29642545] message sent successful 9 
2016-05-18 14:46:39.017 my_app[24514:29642545] message sent successful 4 
2016-05-18 14:46:40.034 my_app[24514:29642545] message sent successful 3 
2016-05-18 14:46:41.115 my_app[24514:29642545] message sent successful 10 
2016-05-18 14:46:42.233 my_app[24514:29642545] message sent successful 6 
2016-05-18 14:46:43.253 my_app[24514:29642545] message sent successful 7 
2016-05-18 14:46:43.253 my_app[24514:29642637] Finished! 

この問題を解決するためにどのように?

答えて

2

2回目の試行。これは私のために働く。あなたはdispatch_group_waitを間違って配置しました。 forループの先頭に置くとうまくいくはずです。それ以外の場合は、すべてのリクエストが既に途中で待機しています。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

    dispatch_async(queue, ^{ 
     [self sendTest]; 
    }); 


} 

- (void) sendTest{ 

    dispatch_group_t group = dispatch_group_create(); 

    NSLog(@"Start ..."); 

    for(int i = 1; i <= 10; i++) 
    { 
     dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 

     dispatch_group_enter(group); 

      NSLog(@"sending message %d ...", i); 

      NSString *webServiceUrl = @"http://ws.audioscrobbler.com/2.0/?method=artist.search&artist=Artist&api_key=c0e97cf5fe59ad032059fb7b2eaab414&format=json"; 

      AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 
      manager.responseSerializer = [AFJSONResponseSerializer serializer]; 



      [manager GET:webServiceUrl parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) { 


     } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 

      NSLog(@"message sent successful %d", i); 

      dispatch_group_leave(group); 

     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
      NSLog(@"message sent failure %d", i); 

      dispatch_group_leave(group); 

     }]; 

    } 

    NSLog(@"Finished!"); 
} 
+0

ありがとうございます、あなたのコードに使用した 'AFNetworking'のバージョンは何ですか? –

+0

あなたは大歓迎です。私は最新のリリース(3.1.0)を使用しました。 –

1

sendTestメソッドを繰り返し呼び出すことで、リクエストが完了した後で再帰的に行うことができます。方法はここにあります。コードをテストしていないので、少し修正する必要があります。ご不明な点がありましたらお気軽にお問い合わせください。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    NSLog(@"Start ..."); 

    [self sentTest:0]; 
} 

- (void) sentTest:(int)i{ 

    if(i >= 10) 
    { 
     NSLog(@"Finished"); 
     return; 
    } 

    NSLog(@"sending message %d ...", i); 

    NSString *webServiceUrl = @"http://ws.audioscrobbler.com/2.0/?method=artist.search&artist=Artist&api_key=c0e97cf5fe59ad032059fb7b2eaab414&format=json"; 

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 

    [manager GET:webServiceUrl parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) { 


    } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
     NSLog(@"message sent successful %d", i); 

     __block int blockI = i + 1; 

     [self sentTest:blockI]; 

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
     NSLog(@"message sent failure %d", i); 

    }]; 

} 

出力:

2016-05-19 10:12:48.460 TestAFNetworking[75972:21147962] Start ... 
2016-05-19 10:12:48.460 TestAFNetworking[75972:21147962] sending message 0 ... 
2016-05-19 10:12:49.014 TestAFNetworking[75972:21147962] message sent successful 0 
2016-05-19 10:12:49.015 TestAFNetworking[75972:21147962] sending message 1 ... 
2016-05-19 10:12:49.524 TestAFNetworking[75972:21147962] message sent successful 1 
2016-05-19 10:12:49.525 TestAFNetworking[75972:21147962] sending message 2 ... 
2016-05-19 10:12:50.126 TestAFNetworking[75972:21147962] message sent successful 2 
2016-05-19 10:12:50.127 TestAFNetworking[75972:21147962] sending message 3 ... 
2016-05-19 10:12:50.637 TestAFNetworking[75972:21147962] message sent successful 3 
2016-05-19 10:12:50.637 TestAFNetworking[75972:21147962] sending message 4 ... 
2016-05-19 10:12:51.477 TestAFNetworking[75972:21147962] message sent successful 4 
2016-05-19 10:12:51.477 TestAFNetworking[75972:21147962] sending message 5 ... 
2016-05-19 10:12:52.257 TestAFNetworking[75972:21147962] message sent successful 5 
2016-05-19 10:12:52.257 TestAFNetworking[75972:21147962] sending message 6 ... 
2016-05-19 10:12:52.595 TestAFNetworking[75972:21147962] message sent successful 6 
2016-05-19 10:12:52.595 TestAFNetworking[75972:21147962] sending message 7 ... 
2016-05-19 10:12:52.937 TestAFNetworking[75972:21147962] message sent successful 7 
2016-05-19 10:12:52.938 TestAFNetworking[75972:21147962] sending message 8 ... 
2016-05-19 10:12:53.540 TestAFNetworking[75972:21147962] message sent successful 8 
2016-05-19 10:12:53.540 TestAFNetworking[75972:21147962] sending message 9 ... 
2016-05-19 10:12:54.043 TestAFNetworking[75972:21147962] message sent successful 9 
2016-05-19 10:12:54.044 TestAFNetworking[75972:21147962] Finished 
+0

ブロックの構造に慣れていないようですが、ブロック内に[self sentTest:i ++]することはできません。また、このようにして 'dispatch_group_create'と 'AFNetworking'を使用する問題はまだ解決されていません。 –

+0

私はまだ私の提案が可能な答えだと思うので、私はあなたの下垂体について少し失望していることを認めなければならない。なぜブロック内でメソッドを呼び出すことができないと思いますか?私は自分のコードを更新し、私が投稿したコードは間違いなく働いています。私はサンプルプロジェクトで試してみました。たとえそれがディスパッチグループを使用していないとしても、要求したようにリクエストを次々と作成します。だからポイントは何ですか? –

+0

私はあなたに投票するのに十分な評判がありません。しかし、私はなぜそれが壮大な中央派遣によって機能しないのかを教えてくれる何かが必要ですか?ありがとうございました。 –

関連する問題