我有一个管理api所有调用的类。
它有一个管理方法,让我们调用这个callAPIMethod:
此方法接受success
和fail
阻止。
在此方法中,我调用uploadTaskWithRequest
来调用API。
在uploadTaskWithRequest完成处理程序中,我希望(取决于结果)将结果传递回success
或fail
块。
我对此有些疑问。它的工作原理是保持一切都非常整洁,但是当我使用成功/失败块调用callAPIMethod
时,它会锁定UI / MainThread,而不是像我期望的那样异步。
我应该如何实施这种模式?还是有更好的方法来解决它?
我不需要支持iOS7之前的版本。
由于
编辑:上面讨论的基本实现。
- (void)callApiMethod:(NSString *)method withData:(NSString *)requestData as:(kRequestType)requestType success:(void (^)(id responseData))success failure:(void (^)(NSString *errorDescription))failure {
[redacted]
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session uploadTaskWithRequest:request
fromData:postData
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
failure(error.description);
} else {
NSError *jsonError;
id responseData = [NSJSONSerialization
JSONObjectWithData:data
options:kNilOptions
error:&jsonError];
if (jsonError) {
failure(jsonError.description);
} else {
success(responseData);
}
}
}];
[task resume];
}
CallAPI方法,使用如下(来自UITableViewController):
[apiController callApiMethod:@"users.json?action=token"
withData:loginData
as:kRequestPOST
success:^(id responseData) {
if ([responseData isKindOfClass:[NSDictionary class]]) {
if ([responseData objectForKey:@"token"]) {
//Store token/credentials
} else if ([responseData objectForKey:@"error"]) {
//Error
[self displayErrorMessage:[responseData objectForKey:@"error"]];
return;
} else {
//Undefined Error
[self displayErrorMessage:nil];
return;
}
} else {
//Error
[self displayErrorMessage:nil];
return;
}
//If login success
}
failure:^(NSString *errorDescription) {
[self displayErrorMessage:errorDescription];
}];
答案 0 :(得分:0)
您的NSURLSession
代码看起来不错。我建议添加一些断点,以便您可以确定它是否在某处死锁,如果是,那么在哪里。但是,此代码示例中没有任何内容可以表明任何此类问题。
我建议您确保将所有UI调用分派回主队列。可以在后台队列上调用此NSURLSessionUploadTask
完成处理程序,但所有UI更新(警报,导航,UIView
控件的更新等)必须在主队列上进行。