从 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?

在 Swift 中为 SOAP POST 从 NSURLConnection 迁移到 NSURLSession

从 Swift 命令行程序中使用 NSURLSession

NSURLSession 重启请求

使用 NSURLSession 时无法调用 didReceiveData