2016-07-20 1 views
0

У меня проблема, я хочу загрузить 9 фотографий на сервер, и я использую круг для загрузки фотографий и для круга, для меня есть resultBlock, который возвращает результат url загруженного изображения для меня, я использую 9 url для сращивания к вложенности, но я использую свой метод, иногда он не будет сращивать все 9 url.iOS: для того, чтобы загрузить несколько фотографий с помощью `AFHTTPSessionManager`, возвращает returnUrl для сращивания к строке

У меня есть использование для справки некоторые аналогичные проблемы, но я не нашел что решение моего вопроса: iOS GCD Sync with Async Block

Это мой код:

// 0.准备参数 
    __block NSString * files = @""; 

    // 1.首先上传图片 
    if (_cell1.selectedAssets.count == 0) { 

     // 没有图片的情况 
     [self doUploadMessageWithFiles:nil]; 
    } else { 

     [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
     __block int comemntCount = 0; 
     for (int i = 0; i < _cell1.selectedAssets.count; i ++) { 
      [Util uploadImage:_cell1.selectedPhotos[i] withUrl:@"prescription/uploadImages" withBlock:^(NSString *returnUrl) { 

       if (i == 0) { 
        files = returnUrl; 
       }else { 
        files = [files stringByAppendingString:[NSString stringWithFormat:@",%@", returnUrl]]; 
       } 

       comemntCount ++; 
       if (comemntCount == _cell1.selectedAssets.count) { 
        [MBProgressHUD hideHUDForView:self.view animated:YES]; 
        [self doUploadMessageWithFiles:files]; // this line is my last step, but the files is not 9 url's composition. because there are asnyc blocks. 
       } 
       NSLog(@"*%@", returnUrl); 

      }]; 

     } 

     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(60.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 

      [MBProgressHUD hideHUDForView:self.view animated:YES]; 

     }); 

    } 

Функция UTIL в:

// 上传图片 
+ (void)uploadImage:(UIImage *)image withUrl:(NSString *)uploadUrl withBlock:(void (^)(NSString *))returnUrl { 

    UIImage *img = image; 

    UIImage *com_img = [Util compressImage:img toMaxFileSize:200 * 1000]; 

    NSData *dataObj = UIImagePNGRepresentation(com_img); 

    NSDictionary * param1 = @{ 
           @"id":@1, 
           @"imgFile":dataObj 
           }; 
    AFHTTPSessionManager * session = [AFHTTPSessionManager manager]; 
    session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"application/xml",@"text/json",@"text/javascript",@"text/html",@"text/plain",@"multipart/form-data",nil]; 

    //拼接地址 
    NSString *url = [NSString stringWithFormat:@"%@%@", BASE_URL, uploadUrl]; // uploadHeader uploadImages 

    [session POST:url parameters:param1 constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { 

     UIImage *img = image; // response 
     NSData *data = UIImagePNGRepresentation(img); 

     // [email protected] 
     [formData appendPartWithFileData:data name:@"imgFile" fileName:@"imgFile.png"mimeType:@"image/png"]; 
    } success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { 

     NSLog(@"success+%@", responseObject); 
     NSString *return_url = [NSString stringWithFormat:@"%@",responseObject[@"data"]]; // 
     // 使用block来传递数据 
     returnUrl(return_url); 



    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) { 
     NSLog(@"fail"); 
    }]; 


} 

EDIT: Я пробовал static dispatch_semaphore_t semaphore;, но я не думаю, что это хорошее решение проблемы, потому что это может сделать процесс загрузки очень медленным.

ответ

0
- (void)sendInfo { 

    // 0.准备参数 
    __block NSString * files = @""; 

    // 1.首先上传图片 
    if (_cell1.selectedAssets.count == 0) { 

     // 没有图片的情况 
     [self doUploadMessageWithFiles:nil]; 
    } else { 

     [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
     __block int comemntCount = 0; 

     NSString *url = @"prescription/uploadImages"; // 不管上传图片:不管是处方,经验交流,信息采集,或者买卖都用这个接口上传。 

     static dispatch_once_t onceToken; 
     static dispatch_semaphore_t semaphore; // sema量 
     static dispatch_queue_t queue; 

     dispatch_once(&onceToken, ^{ 
      semaphore = dispatch_semaphore_create(1); 
      //queue = dispatch_queue_create("com.MyApp.task", NULL); 
      queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 并行队列,异步执行 才能使多个一起执行 
     }); 

     for (int i = 0; i < _cell1.selectedAssets.count; i ++) { //_photosChooseArr 

      dispatch_async(queue, ^{ 

       dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
       [Util uploadImage:_cell1.selectedPhotos[i] withUrl:url withBlock:^(NSString *returnUrl) { 

        if (i == 0) { 
         files = returnUrl; 
         comemntCount ++; 
         if (comemntCount == _cell1.selectedAssets.count) { 
          [MBProgressHUD hideHUDForView:self.view animated:YES]; 
          [self doUploadMessageWithFiles:files]; 

         } 
        }else { 

         files = [files stringByAppendingString:[NSString stringWithFormat:@",%@", returnUrl]]; 
         comemntCount ++; 

         if (comemntCount == _cell1.selectedAssets.count) { 
          [MBProgressHUD hideHUDForView:self.view animated:YES]; 
          [self doUploadMessageWithFiles:files]; 
          //NSLog(@"i = %d, returnUrl = %@, files = %@", i, returnUrl, files); 
         } 
        } 

        dispatch_semaphore_signal(semaphore); 

       }]; 

      }); 

     } 

     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(180.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 

      [MBProgressHUD hideHUDForView:self.view animated:YES]; 

     }); 

    } 

} 
Смежные вопросы