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

利用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을 순서대로 배열에 채우는 경우 일반적으로 하나씩 전달하는 대신 여러 스레드에서 동시에 요청합니다. 이것은 훨씬 빠릅니다.

요청이 순서대로 이루어지도록 하려면 이전 요청이 끝난 후 다음 요청을 보내야 합니다. 예:

으아악

아마도 그런 뜻이겠죠, 아시겠어요?

단, 사진 10장을 업로드할 경우 결과의 순서가 보장되고 하나씩 연재를 요청할 필요가 없는 한 [AFURLConnectionOperation batchOfRequestOperations:]을 사용해야 합니다. 이것이 귀하의 요구 사항을 충족하는지 우선순위를 정하는 것이 가장 좋습니다.

洪涛

귀하의 질문은 다음과 유사합니다 https://segmentfault.com/q/1010000004632... 반환된 결과의 순서만 확인하려는 경우 모든 요청을 순차적으로 수행할 필요는 없습니다.

또한 요청을 순차적으로 수행해야 하는 경우 새 NSOperationQueue를 생성하고 maxConcurrentOperationCount를 1로 설정한 다음 각 요청을 이 NSOperationQueue에 순차적으로 추가할 수 있습니다.

PHPzhong

GCD dispatch_barrier_async를 사용할 수 있지만, 큐는 글로벌 큐가 아닌 직접 생성해야 합니다

으아악
Ty80

새 보조 수업을 작성했는데 도움이 되었으면 좋겠습니다.
https://github.com/sunbohong/SunOrderArr...

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿