【问题标题】:Secondary thread inside other thread其他线程内的辅助线程
【发布时间】:2014-09-11 22:03:18
【问题描述】:

这是我的要求。需要在辅助线程上调用 Web 服务以将人员数据作为字典数组发送。 ({名称:person1, 地址:印度 照片:路径1 }; {名称:person2, 地址:印度 照片:路径2 } ) 在这张照片中,我们有其他网络服务,我们将图像上传到该服务并获得响应路径。

我做了什么。 编写了一个函数并在辅助线程上调用它并启动了一个活动指示器。 在函数内部,一个 for 循环正在制作这个字典。它工作正常。 但是当我在其中同步上传图像时,活动指示器停止。如果我异步执行此操作,当我获得路径响应时,我的主 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 循环中异步上传该图像并将其响应存储在字典中。

谢谢。

【问题讨论】:

    标签: ios multithreading web-services


    【解决方案1】:

    这是我对如何解决嵌套网络请求中的问题的想法。所有网络请求都是异步的。

    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。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 2011-05-22
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多