Rumah > Soal Jawab > teks badan
利用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);
}];
}
巴扎黑2017-04-17 17:53:04
Sudah tentu ia mungkin tidak sama mengikut pendekatan anda Sesetengah permintaan mungkin dikeluarkan kemudian, tetapi pemulangannya lebih cepat, jadi ia dikembalikan dahulu.
Saya tidak tahu sama ada keperluan anda mesti diminta mengikut urutan . Contohnya, jika kami memuat naik 10 gambar pada satu masa dan kemudian memasukkan URL yang dikembalikan ke dalam tatasusunan mengikut urutan, kami biasanya memintanya dalam beberapa urutan pada masa yang sama dan bukannya menghantarnya satu demi satu. Ini lebih cepat.
Jika anda ingin memastikan permintaan dibuat mengikut urutan, anda mesti menghantar permintaan seterusnya selepas tamat permintaan sebelumnya. Contohnya:
- (void)requestWithArray:(NSArray*)array index:(NSInteger)index completion:(SomeBlock)completion {
if (index >= array.count) {
if (completion) {
completion();
}
return;
}
AFHTTPRequestOperationManager* manager = [self httpsRequestManager];
NSDictionary* params = @{"key":array[index]};
__weak typeof(self) weakSelf = self;
[manager GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
[weakSelf requestWithArray:array index:index + 1 completion:completion];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// handle failure
}];
Mungkin itu maksudnya, faham tak?
Tetapi untuk memuat naik 10 gambar, asalkan susunan keputusan dipastikan dan tidak perlu meminta serialisasi satu persatu, [AFURLConnectionOperation batchOfRequestOperations:]
harus digunakan. Adalah lebih baik untuk memberi keutamaan sama ada ini memenuhi keperluan anda.
PHP中文网2017-04-17 17:53:04
Soalan anda serupa dengan soalan ini https://segmentfault.com/q/1010000004632... Jika anda hanya ingin memastikan susunan hasil yang dikembalikan, anda tidak semestinya memerlukan semua permintaan dilakukan secara bersiri.
Selain itu, jika anda mesti membuat permintaan secara bersiri, anda boleh membuat NSOperationQueue baharu, tetapkan maxConcurrentOperationCountnya kepada 1, dan kemudian tambahkan setiap permintaan anda pada NSOperationQueue ini secara berurutan.
PHPz2017-04-17 17:53:04
Anda boleh menggunakan GCD dispatch_barrier_async, tetapi baris gilir mesti dibuat sendiri, bukan baris gilir global
dispatch_queue_t conCurrentQueue = dispatch_queue_create("test", NULL);
NSArray *numAry = @[@"1",@"3",@"4",@"2",];
for (NSString *str in numAry) {
dispatch_barrier_async(conCurrentQueue, ^{
//这里写网络请求
});
}
PHP中文网2017-04-17 17:53:04
Saya menulis kelas tambahan baharu, saya harap ia dapat membantu anda.
https://github.com/sunbohong/SunOrderArr...