从 NSURLSession completionHandler 返回数据



这种异步性质让我失望。

我正在创建一个可以在我的应用程序中使用的类。在类中,我有多个用于多个后端 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对响应做任何你需要的事情。

最新更新