从 NSURLSession completionHandler 返回数据
Posted
技术标签:
【中文标题】从 NSURLSession completionHandler 返回数据【英文标题】:Returning data from a NSURLSession completionHandler 【发布时间】:2016-02-26 13:30:10 【问题描述】:这种异步特性让我很反感。
我正在创建一个可以在我的应用程序中使用的类。在课堂上,我有多个用于多个后端 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 的异步特性,人们如何处理像 auth 这样的调用,或者只是对后端的简单请求/响应?它们都必须本质上是异步的吗?如果是这样,我该怎么做?
【问题讨论】:
How return data from an HTTP request in Swift/Objective C的可能重复 看相关栏目,有几个解决办法。 【参考方案1】:简短的回答是肯定的,你所有的网络请求都应该是异步的。
也许将它想象成一排多米诺骨牌会有所帮助,每个请求都是一张多米诺骨牌,而完成处理程序就是您用来推送该行中的下一个多米诺骨牌的东西。
您的 -DoAPI_A_WithData...
方法隐藏了完成处理程序,这就是您看不到它应该如何工作的原因。
你可以像这样修改它
- (int) doAPI_A_WithData: (NSData *)data onCompletion: (ResponseBlock)resultHandler
您在哪里调用resultHandler
,它会根据任务的completionHandler
对响应进行任何您需要的操作。
【讨论】:
以上是关于从 NSURLSession completionHandler 返回数据的主要内容,如果未能解决你的问题,请参考以下文章
我们是不是应该考虑从 AFNetworking 过渡到 NSUrlSession? [关闭]
如何使用 Swift 从 NSURLSession 获取 cookie?