目标c - 如何从dataTaskWithURL的NSURLResponse获取状态代码?



我正在用苹果的NSURLSession#dataTaskWithURL方法执行一个简单的get请求

[[mySession dataTaskWithURL:myUrl completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
   // fancy code goes here...
 }] resume];

如果我想有一个条件来做某事,如果状态代码是成功的,那么我似乎必须将NSURLResponse转换为NSHTTPURLResponse。。。。。

    NSUInteger statusCode = ((NSHTTPURLResponse *)response).statusCode;
    if (!error && statusCode == 200) {
      // even fancier code goes here
    } else {
      // omg!!!!!!!!!
    }

但是我的问题是:为什么!?!?!?!?!?!?!?

为什么苹果会把一个响应对象传递给一个不知道自己状态的类型?!事实上,我不得不写这段代码,这让我觉得我做错了什么,必须有更好的方法来知道它是200、404还是500…

我希望我可以将completionHandler的块参数类型更改为NSHTTPURLResponse,但这似乎是不可行的!

协议设计如果做得好,总是着眼于未来。

虽然我们现在只将NSURLSession用于HTTP,但将来可能会将其用于其他网络协议。例如,如果你能在某个时候将其用于FTP,我也不会感到惊讶。

为完成块/委托参数使用一个简单的响应基类,并让您根据您知道正在使用的网络协议类型进行强制转换,为NSURLSession提供了未来的灵活性。

如果一个新的网络协议出现时有不同的需求——比如说,它的响应中甚至没有整数状态码——苹果可以添加NSURLResponse的另一个子类,并保持其他一切不变,包括完成处理程序块的签名和所有NSURLSession*Delegate协议。

如果他们对网络协议和完成处理程序块进行了"硬编码"以使用NSHTTPURLResponse,那么如何将新的网络协议(如FTP)干净地添加到NSURLSession?

(注意:所谓"协议",与"网络协议"相反——我在这个答案中使用了这两个术语——我指的是NSURLSession类的接口设计,包括它们的实际协议和等效的完成处理程序。)

从响应中键入NSHTTPURLResponse的实例并使用其statusCode方法。

[NSURLConnection sendAsynchronousRequest:myRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
    NSLog(@"response status code: %ld", (long)[httpResponse statusCode]);
    // do stuff
}];

相关内容

  • 没有找到相关文章

最新更新