У меня проблема, я хочу загрузить 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;
, но я не думаю, что это хорошее решение проблемы, потому что это может сделать процесс загрузки очень медленным.