【问题标题】:[NSURLSessionDataTask response]: unrecognized selector sent to instance[NSURLSessionDataTask 响应]:无法识别的选择器发送到实例
【发布时间】:2015-12-16 08:34:43
【问题描述】:

有以下问题:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSURLSessionDataTask 响应]:无法识别的选择器发送到实例 0x7fced8599e60”

这就是它的来源:

GET("users/check_email", parameters: parameters, progress: nil, success: { sessionDataTask, response in

    //the line with error
    let statusCode = (sessionDataTask.response as? NSHTTPURLResponse)?.statusCode ?? 0

    completionBlock(self.queryType?.mockStatusCode ?? statusCode, nil)

    }) { sessionDataTask, error in

        completionBlock(nil, NSError(responseError: error))
}

当我尝试模拟响应时会发生这种情况。在代码的某个地方,我传递给success 块:

var sessionDataTask = NSURLSessionDataTask()
success?(sessionDataTask, queryType?.mockResponse())

sessionDataTask 有问题。 NSURLSessionDataTask 继承自具有 response 属性的 NSURLSessionTask。不知道为什么会出现这个错误。

【问题讨论】:

  • 将断点放在“statusCode = (sessionDataTask.response as?NSHTTPURLResponse)?...”行并检查 sessionDataTask 对象类型。
  • po sessionDataTask 返回<NSURLSessionDataTask: 0x7f9ca9d1d4e0>
  • 检查...正确的论点是否到来?
  • 再澄清一点,不明白你的意思。
  • handler给你sessionDataTask和response,试试在(sessionDataTask.response as?NSHTTPURLResponse)中使用response而不是sessionDataTask?

标签: ios swift exception


【解决方案1】:

如果你像下面这样声明你的模拟 NSURLSessionDataTask,响应将为 nil。

对象 C:

NSURLSessionDataTask * sessionDataTask = [[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]] dataTaskWithURL:[NSURL URLWithString:@""]];
[sessionDataTask response];

斯威夫特:

var sessionDataTask = NSURLSessionDataTask(NSURLSession(sessionWithConfiguration:NSURLSessionConfiguration.defaultSessionConfiguration()).dataTaskWithURL(NSURL(string: "")))
sessionDataTask.response()

【讨论】:

    【解决方案2】:

    Apple 文档说:

    public class NSURLSessionTask : NSObject, NSCopying {
        @NSCopying public var response: NSURLResponse? { get } /* may be nil if no response has been received */
    }
    

    所以 Swift 中唯一的解决方案是:

    var statusCode = 0
    
    if sessionDataTask.respondsToSelector(Selector("response")) {
        statusCode = (sessionDataTask.response as? NSHTTPURLResponse)?.statusCode ?? 0
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 2012-07-24
      相关资源
      最近更新 更多