ios - AFMultipartFormData 上传完成后运行方法

标签 ios objective-c afnetworking multipartform-data afnetworking-3

我使用 AFMultipartFormData 将多张图片发送到服务器,使用 for 循环一次获取一张图片:

NSString *string = [NSString stringWithFormat:@"%@/API/Upload",BaseURLString];
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
    [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
    NSError *error;
    NSString *mystring = @"noName";
//FOR Loop Start
    for(NSData *eachImage in dataStringArray) {

        NSURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:string parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

            [formData appendPartWithFormData:eachImage name:@"myImage"];
            [formData appendPartWithFormData:[mystring dataUsingEncoding:NSUTF8StringEncoding]
                                        name:@"FileName"];
        } error:&error];

        NSURLSessionDataTask *task = [manager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@", error.localizedDescription);
                return;
            }

            [uploadedImageIDs addObject:[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]];

        }];
        [task resume];
    }//for end
        [self makeJSON:uploadedImageIDs];

但不知何故,它之前调用了 makeJSON 方法。由于有多张图片,所以我需要在所有图片上传完成后调用它。

最佳答案

网络处理将以异步方式运行,因此您需要在网络 completionHandler 中计数以了解所有任务何时完成。像这样

NSString *string = [NSString stringWithFormat:@"%@/API/Upload",BaseURLString];
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
    [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
    NSError *error;
    NSString *mystring = @"noName";
    NSInteger count = 0;

//FOR Loop Start
    for(NSData *eachImage in dataStringArray) {

        NSURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:string parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

            [formData appendPartWithFormData:eachImage name:@"myImage"];
            [formData appendPartWithFormData:[mystring dataUsingEncoding:NSUTF8StringEncoding]
                                        name:@"FileName"];
        } error:&error];

        NSURLSessionDataTask *task = [manager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
            count++;

            if (error) {
                NSLog(@"%@", error.localizedDescription);
            } else {
                [uploadedImageIDs addObject:[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]];
            }

            if (count == dataStringArray.count) {
              [self makeJSON:uploadedImageIDs];
            }
        }];
        [task resume];
    }//for end

关于ios - AFMultipartFormData 上传完成后运行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40507074/

相关文章:

设置 subview 的layer.cornerRadius后,iOS UITableView滚动不流畅

objective-c - Objective-C - 如果在 CGRectmake 上声明?

iphone - 我如何在动画进行时修改 contentInset?

ios - AFNetworking 在 View 重新打开后恢复进度条

ios - 属性(property)有先前的声明

iphone - 如何在控制台 Xcode 中打印?

ios像android一样通过短信验证

ios - VS Cordova : is there any way to apply different config. xml 设置取决于所选配置?

ios - 当钥匙串(keychain)被锁定时哪些钥匙串(keychain)属性是不可访问的?

ios - 在 MKMapView 上轮选位置