ios - 利用afnetworking3.0通过for循环发送请求,如何保证接收到数据的顺序和发送请求的顺序一致?
巴扎黑
巴扎黑 2017-04-17 17:51:04
0
4
428

利用AFN3.0进行网络请求,要发送的参数在一个数组里,每次取数组中的一条数据设置参数发送请求,

我通过for循环遍历数组并设置参数发送请求,将网络请求返回的数据添加到一个新的数组中,

发现不是每次请求返回的数据的顺序是一样的,功能需求返回数据的排序必须跟发送请求的顺序是一样的,

求问有什么方法保证前一次请求返回数据之后再发送下一次请求?

非常感谢,万分感谢!!!!

/**
 *  加载订单数据,设置控件位置
 */
- (void)loadOrderData {
        NSString *userID = [[NSUserDefaults standardUserDefaults] stringForKey:@"GOId"];
        NSDictionary *dict = @{
                               @"GOId" : userID,
                               };
        // 将字典转为json
        NSDictionary *params = [ELHOCToJson ocToJson:dict];
        
        NSString *URL = [NSString stringWithFormat:@"%@RealtimeOrder_getROListCon12345.action", ELHBaseURL];
        
        
        __weak typeof(self) weakSelf = self;
        [self.manager POST:URL parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            weakSelf.ELHOrderArray = [ELHOrderModel mj_objectArrayWithKeyValuesArray:responseObject];
            

            
            // 获取订单编号
            for (int i = 0; i < weakSelf.ELHOrderArray.count; i++) {
                ELHOrderModel *model = weakSelf.ELHOrderArray[i];
                
                [weakSelf.ELHOrderNumArray addObject:model.ROBM];
                
            }
            

            // 根据获取到的订单编号加载订单详情列表
            if (weakSelf.ELHOrderNumArray != nil) {
                dispatch_queue_t conCurrentQueue = dispatch_queue_create("order", NULL);
                for (NSString *ROBM in weakSelf.ELHOrderNumArray) {
                    dispatch_barrier_async(conCurrentQueue, ^{
                        // 加载订单详情列表
                        [self loadOrderDetailData:ROBM];
                    });
                }
            }
            
            
       
            
            // 刷新数据
            [orderVC.tableView reloadData];
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"%@", error);
        }];
    
}



/**
 *   加载订单详情列表
 */
- (void)loadOrderDetailData:(NSString *)ROBM {
    NSDictionary *dict = @{
                           @"ROBM" : ROBM,
                           };
    
    // 字典转json
    NSDictionary *params = [ELHOCToJson ocToJson:dict];
    
    NSString *URL = [NSString stringWithFormat:@"%@OrderPrice_getOPListByROBM.action", ELHBaseURL];
    
    __weak typeof(self) weakSelf = self;
    [self.manager POST:URL parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {       
    
        // 将获取到的订单详情数据逐个添加到数组中
        [weakSelf.ELHOrderDetailArray addObject:[ELHOrderDetailModel mj_objectArrayWithKeyValuesArray:responseObject]];
        ELHOrderTableViewController *orderVC = weakSelf.childViewControllers.firstObject;
        
        orderVC.orderDetailArray = weakSelf.ELHOrderDetailArray;
        
        // 刷新数据
        [orderVC.tableView reloadData];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@", error);
    }];
}
巴扎黑
巴扎黑

全員に返信(4)
巴扎黑

もちろん、アプローチによっては同じではない場合もありますが、後で発行されるリクエストもありますが、返される方が早いため、最初に返されます。

あなたのニーズを 順番に リクエストする必要があるかどうかわかりません。たとえば、一度に 10 枚の写真をアップロードし、返された URL を順番に配列に詰め込む場合、通常はそれらを 1 つずつ渡すのではなく、複数のスレッドで同時にリクエストします。これははるかに高速です。

リクエストが順番に行われるようにしたい場合は、前のリクエストの終了後に次のリクエストを送信する必要があります。例:

リーリー

多分そういうことなんですが、分かりますか?

ただし、10 枚の写真をアップロードする場合、結果の順序が保証され、1 枚ずつシリアル化を要求する必要がない限り、[AFURLConnectionOperation batchOfRequestOperations:] を使用する必要があります。これがニーズを満たすかどうかを優先することが最善です。

いいねを押す +0
洪涛

あなたの質問はこれと似ています https://segmentfault.com/q/1010000004632... 返される結果の順序を保証したいだけの場合は、必ずしもすべてのリクエストを連続して実行する必要はありません。

さらに、リクエストを連続的に行う必要がある場合は、新しい NSOperationQueue を作成し、その maxConcurrentOperationCount を 1 に設定して、各リクエストをこの NSOperationQueue に順番に追加できます。

いいねを押す +0
PHPzhong

GCDdispatch_barrier_async を使用できますが、キューはグローバル キューではなく自分で作成する必要があります

リーリー
いいねを押す +0
Ty80

新しい補助クラスを書きました。お役に立てれば幸いです。
https://github.com/sunbohong/SunOrderArr...

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート