其他线程内的辅助线程

时间:2014-09-11 06:30:25

标签: ios multithreading web-services

这是我的要求。需要在辅助线程上调用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循环中的图像并将其响应存储在字典中。

感谢。

1 个答案:

答案 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。

希望这可以启发你这个问题