Migrate AFNetworking 2.x -> 3.x
Document
https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-3.0-Migration-Guide
Tips
simple request
2.x
    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];
    [manager POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        onSuccess();
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        onFailed(error);
    }];
3.x
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        onSuccess();
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        onFailed(error);
    }];
Get status code in failure callback
2.x
failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
        onFailed([AppError readErrorResponse:operation error:error], [operation.response statusCode]);
    }
3.x
NSHTTPURLResponse *response = error.userInfo[AFNetworkingOperationFailingURLResponseErrorKey];  
response.statusCode;  
"PUT" MultipartForm Request
2.x
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    NSMutableURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"PUT" URLString:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            [formData image name:@"image" fileName:@"test.jpg" mimeType:@"image/jpeg"];
        }
    } error:nil];
    AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"success");
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
    }];
    [manager.operationQueue addOperation:operation];
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    NSMutableURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"PUT" URLString:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        if (image) {
            [formData image name:@"image" fileName:@"test.jpg" mimeType:@"image/jpeg"];
        }
    } error:nil];
    [[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {        
        if (!error) {
            NSLog(@"success");
        } else {
            NSLog(@"Error: %@", error);
        }
    }] resume];