这是我的要求。需要在辅助线程上调用Web服务,以将人员数据作为字典数组发送。 ({名称:PERSON1, 地址:印度 照片:路径1 }; {名称:PERSON2, 地址:印度 照片:路径2 } ) 在这张照片中我们有其他网络服务,我们上传图片并获得回复路径。
我做了什么。 写了一个函数并在辅助线程上调用它并启动了一个活动指示器。 内部函数for循环正在制作这个词典。它工作正常。 但是当我同步上传图像时,活动指示停止。如果我异步执行,当我得到路径响应时,我的主循环已经消失了,我没有字典对象来添加路径。
-(BOOL)callSynchWebService
{
__block BOOL validateFlag=NO;
MBProgressHUD * progressHud = [[MBProgressHUD alloc] initWithView:self.view];
InterNetConnectionService *netService=[[InterNetConnectionService alloc]init];
if(![netService checkFornetConnectionWithStatus] )
{
[self.view addSubview:progressHud];
progressHud.mode = MBProgressHUDModeIndeterminate;
progressHud.labelText = @"Loading";
[progressHud show:YES];
for (Person *p in array_persons)
{
NSMutableDictionary *dict=[[NSMutableDictionary alloc]init];
[dict setObject:p.name forKey:@"Name"];
[dict setObject:p.address forKey:@"Address"];
NSString *photoResult=[self sendingPhototoServer:p.image];
[dict setObject:photoResult forKey:@"Photo"];
}
}
然后使用ASIHTTP发送此数组。
请你能帮助我异步上传这个for循环中的图像并将其响应存储在字典中。
感谢。
答案 0 :(得分:0)
以下是我如何在嵌套网络请求中解决您的问题的想法。所有网络请求都是异步的。
UIImage *image = [UIImage imageNamed:@"example"];
NSArray *originalArray = @[@{@"name": @"person1", @"image": image, @"address": @"india"},
@{@"name": @"person1", @"image": image, @"address": @"india"},
@{@"name": @"person1", @"image": image, @"address": @"india"}];
__block NSMutableArray *uploadArray = [NSMutableArray array];
for (NSDictionary *item in originalArray) {
//use AFNetworking here
//all network request in AFNetworking is asynchronous
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:@"example.com/imageupload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
NSData *data = UIImagePNGRepresentation(item[@"image"]);
[formData appendPartWithFileData:data name:@"pic" fileName:@"image.png" mimeType:@"image/png"];
} success:^(NSURLSessionDataTask *task, id responseObject) {
[uploadArray addObject:@{@"name": @"person1",
@"imagePath":responseObject[@"url"],
@"address":@"india"}];
if (uploadArray.count == originalArray.count) {
[manager POST:@"example.com/arrayupload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// convert the uploadArray to json or other and add to http body
} success:^(NSURLSessionDataTask *task, id responseObject) {
//finished
} failure:^(NSURLSessionDataTask *task, NSError *error) {
//upload failed
}];
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
//upload failed
}];
}
如果您需要在网络请求期间阻止主线程添加HUD。
希望这可以启发你这个问题