如何同步使用AFNetworking 2.0

q0r*_*0re 4 objective-c synchronous afnetworking-2

我已经搜索了很多关于如何同步运行AFNetworking 2.0的示例和教程,并且只找到了AFNetworking 1.0的解决方案.我发现:AFNetworking可以同步返回数据(在一个块内)吗?

我的例子:

- (User *)getUserWithUsername: (NSString *) username andPassword: (NSString *) password {

    NSDictionary *params = @{@"email": username, @"password": password};


    [[DCAPIClient sharedClient] POST:@"login" parameters:params success:^(NSURLSessionDataTask * __unused task, id JSONResult) {
        NSLog(@"JSON %@", JSONResult);
        BOOL errorCode = [JSONResult objectForKey:@"error"];
        if (!errorCode) {
            self.username = [JSONResult objectForKey:@"name"];            
            // Fill the attributes
            // self.email = .. a
         } else {
            // error with login show alert
         }

     } failure:^(NSURLSessionDataTask *__unused task, NSError *error) {
         NSLog(@"error %@", error);
     }];

     // this does not work
     //[[[DCAPIClient sharedClient] operationQueue] waitUntilAllOperationsAreFinished];


     if (self.username == nil) {
         return nil;
     }

     return self;

}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为if (self.username == nil)首先调用.

如何让AFNetworking 2.0 lib同步运行,我可以返回响应?

DCAPIClient:AFHTTPSessionManager

+ (instancetype)sharedClient {
    static DCAPIClient *_sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[DCAPIClient alloc] initWithBaseURL:[NSURL URLWithString:DCAPIBaseURLString]];
        _sharedClient.responseSerializer = [AFJSONResponseSerializer serializer];
    });

    return _sharedClient;
}
Run Code Online (Sandbox Code Playgroud)

yon*_*evy 5

仇恨者会讨厌,但有时你只是希望你的HTTP调用是同步的.

为此,您可以使用AFNetworking-Synchronous库.它增加了一个方便的类别AFHTTPRequestOperationManager与同步方法,如syncGETsyncPOST其内部使用AFNetworking的waitUntilFinished实现同步调用.