NSURLProtocol & swift - ios7 中的错误

Posted

技术标签:

【中文标题】NSURLProtocol & swift - ios7 中的错误【英文标题】:NSURLProtocol & swift - error in ios7 【发布时间】:2014-10-03 08:38:33 【问题描述】:

我尝试按照以下教程中的说明实现 NSURLProtocol:http://www.raywenderlich.com/76735/using-nsurlprotocol-swift

ios8 上一切正常,但在 iOS7 中我在 startLoading() 中遇到运行时错误。

override func startLoading() 
    var newRequest = self.request.copy() as NSMutableURLRequest //<- this line fails
    NSURLProtocol.setProperty(true, forKey: "MyURLProtocolHandledKey", inRequest: newRequest)

    self.connection = NSURLConnection(request: newRequest, delegate: self)

错误:WebCore:CFNetwork Loader(10):EXC_BREAKPOINT

有人成功实现了 NSURLProtocol 吗?谢谢!

【问题讨论】:

如果使用var newRequest = self.request.mutableCopy() as NSMutableURLRequest,是否有效?因为我不希望 copy() 返回一个可变请求。 谢谢马特,这行得通! 酷;我已将其添加为答案。 【参考方案1】:

似乎在最新版本的 XCode (6.0.1) 中,无法将 NSURLRequest 转换为 NSMutableURLRequest

这里是 swift 编译器错误信息:

'NSURLRequest' is not convertible to 'NSMutableURLRequest'

您可以通过这种替代方式创建NSMutableURLRequest 的实例

var newRequest = NSMutableURLRequest(URL: self.request.URL, 
               cachePolicy: self.request.cachePolicy, 
               timeoutInterval: self.request.timeoutInterval)

【讨论】:

谢谢,安东尼!只是为了提高自己,你是怎么看到swift编译器错误信息的?我看到的唯一提示是 CFNetwork Loader 错误。 我只是预感到这是类型转换问题。我在操场上写了一个简单的类型转换,并迅速发出了上述错误消息。所以你不会在你的项目中看到这个特定的错误信息 Anthony,我在某些需要登录的页面上遇到了您的解决方案的问题。按照 Matt 的建议创建一个可变副本。【参考方案2】:

您的问题是(非可变)NSURLRequest 的副本是另一个不可变的 NSURLRequest,因此不能转换为 NSMutableURLRequest。试试:

var newRequest = self.request.mutableCopy() as NSMutableURLRequest // mutableCopy() instead of copy()

这应该会给你一个原始请求的可变副本,应该可以很好地转换。

【讨论】:

以上是关于NSURLProtocol & swift - ios7 中的错误的主要内容,如果未能解决你的问题,请参考以下文章

NSURLProtocol的总结

NSURLProtocol 详解

NSURLProtocol 使用 AJAX 超时

NSURLProtocol总结:NSURLProtocol 的本质是对特殊的scechme进行特殊的协议定制

iOS 开发之— NSURLProtocol

在自定义 NSURLProtocol 中捕获 POST 参数