検索

ホームページ  >  に質問  >  本文

ios - afnetworking通过for循环发送请求,如何保证接收到数据的顺序和发送请求的顺序一致?

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

我通过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 success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            weakSelf.ELHOrderArray = [ELHOrderModel mj_objectArrayWithKeyValuesArray:responseObject];
            

            dispatch_queue_t conCurrentQueue = dispatch_queue_create("order", NULL);
            // 获取订单编号
            for (int i = 0; i < weakSelf.ELHOrderArray.count; i++) {
                ELHOrderModel *model = weakSelf.ELHOrderArray[i];
                
                [weakSelf.ELHOrderNumArray addObject:model.ROBM];
                dispatch_barrier_async(conCurrentQueue, ^{
                        // 加载订单详情列表
                        [self loadOrderDetailData:model.ROBM];    // 问题可能就出在这个for循环里,发送请求的顺序应该是按顺序发送的,但是返回数据的时间可能就不一样了,所以造成了数据顺序错乱的问题,求问如何解决此问题?
                    });
            }
            
            
       
            
            // 刷新数据
            [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 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);
    }];
}
阿神阿神2772日前700

全員に返信(5)返信します

  • 阿神

    阿神2017-04-17 17:53:19

    シーケンス制御のためにafnetworkingのコールバックでdispatch_group_async関数を使用するという妥協案を見つけました。
    コードは次のとおりです:

    リーリー

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 17:53:19

    ドキュメントを見ると、operationQueue コールバックを処理するために delegate が使用されています。NSURLSessionConfigurationHTTPMaximumConnectionsPerHost は、同じドメイン名で一度に 1 つのリクエストのみが開始されることを保証します。 コードは次のとおりです。 :

    リーリー

    ただし、AFNetworking はデータの処理に並列キュー url_session_manager_processing_queue() を使用します。このキューの順序は保証できないため、実際にはコールバックの直列性は保証できません

    ------------------------------------------元の回答----- ------------------------
    manger内のqueuemaxConcurrentOperationCountを1に設定します。

    そしてあなたの dispatch_barrier_async 何をしたいのかわかりませんが、for ループは本質的にシリアルです

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 17:53:19

    まず送信キューを一時停止し、次に for ループでリクエストが生成されたときに、リクエスト間に依存関係を追加してキューに入れます。

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:53:19

    返されたデータの順序を決定する方法はまだありません...

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 17:53:19

    私もこの問題に遭遇しました、解決しましたか?どうやってやったの

    返事
    0
  • キャンセル返事