sociatedObject(group, &groupErrorKey);
[arrayM addObject:error];
failure(error);
dispatch_group_leave(group);
}];
}
- (void)sendGroupPostRequest:(BlockAction)requests success:(BlockAction)success failure:(GroupResponseFailure)failure {
if (requests == nil) {
return;
}
dispatch_group_t group = dispatch_group_create();
objc_setAssociatedObject(group, &groupErrorKey, [NSMutableArray array], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
Method originalPost = class_getInstanceMethod(self.class, @selector(sendPOSTRequest:withData:paramForm:withTimeout:showAlert:success:failure:));
Method groupPost = class_getInstanceMethod(self.class, @selector(sendPOSTRequestInGroup:withData:paramForm:withTimeout:showAlert:success:failure:));
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
objc_setAssociatedObject(queue, &queueGroupKey, group, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
queue.qualityOfService = NSQualityOfServiceUserInitiated;
queue.maxConcurrentOperationCount = 3;
[queue addOperationWithBlock:^{
method_exchangeImplementations(originalPost, groupPost);
requests();
// 发出请求后就可以替换回original method,不必等待回调,尽量减小替换的时间窗口
method_exchangeImplementations(originalPost, groupPost);
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSMutableArray *arrayM = objc_getAssociatedObject(group, &groupErrorKey);
if (arrayM.count > 0) {
if (failure) {
failure(arrayM.copy);
}
} else if(success) {
success();
}
});
}];
}
- (void)sendPOSTRequestInGroup:(NSString *)strURL withData:(NSDictionary *)data paramForm:(ParamForm)paramForm withTimeout:(NSTimeInterval)timeout showAlert:(BOOL)show success:(BlockResponse)success failure:(BlockResponseFailure)failure
替换网络工具层的底层post请求
sendPOSTRequest:withData:paramForm:withTimeout:showAlert:success:failure:
这样在
- (void)sendGroupPostRequest:(BlockAction)requests success:(BlockAction)success failure:(GroupResponseFailure)failure
requests block中,把网络请求扔进去,单个请求本身的success和failure都能执行,success执行组成功的代码,failure中可以拿到每个请求的error,作相应处理。