这种异步性质让我失望。
我正在创建一个可以在我的应用程序中使用的类。在类中,我有多个用于多个后端 API 的 URL(a.com/A a.com/B 等)。让我们调用类 NwrkDriver
@implementation NwrkDriver: NSObject
// Data is already formatted into a JSON doc.
- (int)PostToServer:(NSString *)url WithData:(NSData *)postData
{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url] ];
[request setHTTPMethod:@"POST"];
<snip> deleted code for readability </snip>
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest
completionHandler
{
// Handle response here
// Where to put response obtained here?
}];
[uploadTask resume];
return 0;
}
- (int) DoAPI_A_WithData: (NSData *)data AndResult: (NSData *)result
{
NSString *url = "https://example.com/A";
[ self PostToServer:url WithData:data];
// How to populate results here?
}
@end
我想在代码中的其他类中使用此 NwrkDriver。因此,理想情况下,如果我想进行登录,我将在 NwrkDriver 类中创建登录 API 调用并使用适当的数据调用它。所以在登录类中
@implementation Login: NSObject
{
- (int) doLogin
{
NwrkDriver *nwrk = [[NwrkDriver alloc] init]
NSData *req, *response;
<snip> deleted code for readability </snip>
[nwrk DoAPI_A_WithData:req AndResult: response];
// Now parse the response which is JSON also
}
}
看起来我正在根据串行执行进行编写/思考,但事实并非如此。
由于 NSURLSession 的异步性质,人们如何处理身份验证等调用或只是对后端的简单请求/响应?它们都必须在本质上异步吗?如果是这样,我该怎么做?
简短的回答是肯定的,您的所有网络请求都应该是异步的。
也许把它想象成一排多米诺骨牌,每个请求都是多米诺骨牌,而完成处理程序是你用来推动行中的下一个多米诺骨牌的。
您的-DoAPI_A_WithData...
方法隐藏了完成处理程序,这就是您看不到它应该如何工作的原因。
你可以像
- (int) doAPI_A_WithData: (NSData *)data onCompletion: (ResponseBlock)resultHandler
你调用resultHandler
的地方,它会从任务的completionHandler
对响应做任何你需要的事情。