2

我有一个旧项目无法在 iOS 9 中运行。我已阅读有关 AFNetworking 的官方文档并完成了大部分迁移。

网络管理器:

_requestManager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:baseURL ]];
//here we can set the request header as the access token once we have logged in.
AFHTTPRequestSerializer *requestSerializer = [AFHTTPRequestSerializer serializer];
AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
[_requestManager setRequestSerializer:requestSerializer];
[_requestManager setResponseSerializer:responseSerializer];

早期版本:

// 2. Create an `NSMutableURLRequest`.
NSMutableURLRequest *request =
    [[NetworkManager sharedInstance].requestManager.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:fullPath
                                                                                          parameters:nil
                                                                           constructingBodyWithBlock: ^(id <AFMultipartFormData> formData) {
    NSString *fileName = [NSString stringWithFormat:@"%@.caf", theAudioItem.media_item_name];
    [formData appendPartWithFileData:audioData name:theAudioItem.media_item_name fileName:fileName mimeType:@"audio/caf"];
}];

// 3. Create and use `AFHTTPRequestOperationManager` to create an `AFHTTPRequestOperation` from the `NSMutableURLRequest` that we just created.
AFHTTPRequestOperation *operation =
    [[NetworkManager sharedInstance].requestManager HTTPRequestOperationWithRequest:request
                                                                            success: ^(AFHTTPRequestOperation *operation, id responseObject) {
    result(YES, @"");
} failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
    if (operation.responseData) {
        NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil];

        result(NO, [responseDict valueForKey:@"Message"]);
        [self deleteTmpFilesFromParts:formParts];
    } else {
        result(NO, [NSString stringWithFormat:@"Failed to upload media to %@!", gallery.gallery_name]);
        [self deleteTmpFilesFromParts:formParts];
    }


    result(NO, errorMessage);
}];

// 4. Set the progress block of the operation.
[operation setUploadProgressBlock: ^(NSUInteger __unused bytesWritten,
                                     long long totalBytesWritten,
                                     long long totalBytesExpectedToWrite) {
    DLog(@"progress is %i %lld %lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
    progress((float)totalBytesWritten / (float)totalBytesExpectedToWrite);
}];

// 5. Begin!
[operation start];

转换后的响应:(更新了给出错误的评论)

//No visible @interface for 'AFHTTPRequestSerializer<AFURLRequestSerialization>' declares the selector 'multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:'
    NSMutableURLRequest *request =
        [[NetworkManager sharedInstance].requestManager.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:fullPath parameters:nil
                                                                               constructingBodyWithBlock: ^(id <AFMultipartFormData> formData) {
        NSString *fileName = [NSString stringWithFormat:@"%@.caf", theAudioItem.media_item_name];
        [formData appendPartWithFileData:audioData name:theAudioItem.media_item_name fileName:fileName mimeType:@"audio/caf"];
    }];

    // 3. Create and use `AFHTTPRequestOperationManager` to create an `AFHTTPRequestOperation` from the `NSMutableURLRequest` that we just created.
   //No visible @interface for 'AFHTTPSessionManager' declares the selector 'HTTPRequestOperationWithRequest:success:failure:'
    NSURLSessionTask *operation =
        [[NetworkManager sharedInstance].requestManager HTTPRequestOperationWithRequest:request
                                                                                success: ^(NSURLSessionTask *operation, id responseObject) {
        result(YES, @"");
    } failure: ^(NSURLSessionTask *operation, NSError *error) {

        //Error for operation doesn't have responseData
        if (operation.responseData) {
            NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil];

            result(NO, [responseDict valueForKey:@"Message"]);
            [self deleteTmpFilesFromParts:formParts];
        } else {
            result(NO, [NSString stringWithFormat:@"Failed to upload media to %@!", gallery.gallery_name]);
            [self deleteTmpFilesFromParts:formParts];
        }

        // get the response
        result(NO, errorMessage);
    }];

    // 4. Set the progress block of the operation.
    //No visible @interface for 'NSURLSessionTask' declares the selector 'setUploadProgressBlock:'
    [operation setUploadProgressBlock: ^(NSUInteger __unused bytesWritten,
                                         long long totalBytesWritten,
                                         long long totalBytesExpectedToWrite) {
        DLog(@"progress is %i %lld %lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
        progress((float)totalBytesWritten / (float)totalBytesExpectedToWrite);
    }];

    // 5. Begin!
    //No visible @interface for 'NSURLSessionTask' declares the selector 'start'
    [operation start];
4

1 回答 1

2

的等效代码AFHTTPSessionManager很简单:

NSURLSessionTask *task = [[[NetworkManager sharedInstance] requestManager] POST:fullPath parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    NSString *fileName = [NSString stringWithFormat:@"%@.caf", theAudioItem.media_item_name];
    [formData appendPartWithFileData:audioData name:theAudioItem.media_item_name fileName:fileName mimeType:@"audio/caf"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
    NSLog(@"%.3f", uploadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    // success
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    // failure

    // if you need to process the `NSData` associated with this error (if any), you'd do:

    NSData *data = error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey];
    if (data) { ... }
}];

这与您的 v1.x 代码相比有两个主要变化:首先,他们在 2.x 中引入了GET/ POST/etc。使您免于手动启动操作(或将其添加到您自己的队列)的方法。其次,随着3.x,他们退役NSOperation了框架AFHTTPRequestOperationManager,现在使用AFHTTPSessionManagerclass,where GET// POSTetc。不要返回NSOperation子类,而是NSURLSessionTask引用。

于 2016-02-11T10:29:24.967 回答