运行 AFMultipartFormData上传完成时的方法

Run a method when AFMultipartFormData is finished uploading

我正在使用 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 方法。由于有多个图片,所以我需要在所有图片上传完成后调用它。

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

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