无法在 Alamofire response.result.value 中使用 NSURL!斯威夫特,xcode 7.3

Posted

技术标签:

【中文标题】无法在 Alamofire response.result.value 中使用 NSURL!斯威夫特,xcode 7.3【英文标题】:Unable to use NSURL in Alamofire response.result.value! Swift, xcode 7.3 【发布时间】:2016-08-19 00:54:49 【问题描述】:

我有一个正在开发的媒体播放器应用程序,我正在发送一个 Alamofire 请求以获取字符串形式的 URL...当我收到响应时,我确实将它作为字符串正确接收,但是当我尝试将其转换为 NSURL 时,我一直为零。

请求是:

  Alamofire.request(.GET, URLString, parameters: ["foo": "bar"])
        .validate(statusCode: 200..<300)
        .responseString(encoding: NSUTF8StringEncoding)   response in
            print("Response: \(response)")
            print("Response String: \(response.result.value!)")
            self.URLToPlay = response.result.value!
    

我的 URLString 是一个字符串,我的 URLToPlay 也是一个字符串。 我用来将其转换为 NSURL 的命令是

  let streamingURL = NSURL(string: self.URLToPlay) 

我在 URLToPlay 中得到了一个看起来像 URL 的有效字符串,事实上,如果我将接收到的字符串复制/粘贴到浏览器,我可以播放媒体...但是当我使用它转换为 NSURL 时,我的应用崩溃(由于 streamingURL 为 nil)。

现在我相信这与异步请求有关,但我想知道是否有人知道如何让它工作?

非常感谢您的帮助。

编辑为使用完成处理程序:

  func connectToServer() 
    print("Connecting...")

    finishLoad  theUrl in

        let urlString = theUrl.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
        let streamingURL = NSURL(string: urlString!)

  // do what i need to do

    

    isConnectedToServer = true
    print("Connected...")

func finishLoad(complete: (urlToBePlayed: String) -> ()) 
    var aVar: String!
    Alamofire.request(.GET, URLString, parameters: ["foo": "bar"])
        .validate(statusCode: 200..<300)
        .responseString(encoding: NSUTF8StringEncoding)   response in
            aVar = response.result.value!
            complete(urlToBePlayed: aVar)
    

【问题讨论】:

【参考方案1】:

这是一个Async进程,无论你在哪里使用URLToPlayOUTSIDEAlamofire.GET函数,它都会返回nil,因为它将是@ 987654326@ 因为进程是异步的,变量仍然没有更新。您可以将其包装在完成处理程序中并像这样使用:

func finishLoad(complete: (urlToBePlayed: String) -> ()) 
let aVar: String!
 Alamofire.request(.GET, URLString, parameters: ["foo": "bar"])
        .validate(statusCode: 200..<300)
        .responseString(encoding: NSUTF8StringEncoding)   response in
            print("Response: \(response)")
            print("Response String: \(response.result.value!)")
            aVar = response.result.value!             
            complete(urlToBePlayed: aVar)
    

现在调用并像这样使用它:

finishLoad  theUrl in
let urlString = theUrl.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQ‌​ueryAllowedCharacter‌​Set())  //Fixes the deprecated error.
var convertToURL = NSURL(string: urlString)!     
 print(convertToURL)

//here you do what you want

【讨论】:

感谢您抽出宝贵时间回答!,我偷偷怀疑我需要使用“完成处理程序”......我只是想我必须使用 NSNotifications 和观察者......但这似乎是个好主意......我会在一段时间内测试一下并回复你 我已将您的示例添加到我的原始帖子中,但在尝试将字符串转换为 NSURL 后,我仍然发现错误 nil ... print(theUrl)theUrl in 之后看看它是否显示了什么? 是的,我做到了,我确实得到了一个有效的字符串......错误出现在我说的以下代码行之后:让 streamingURL = NSURL(string: theUrl) 然后我尝试使用它通过说: self.playerItem = AVPlayerItem(URL: streamingURL!) ... 那就是它崩溃的时候,因为它正在尝试使用 streamingURL 但它是 nil ...所以将“theUrl”转换为 NSURL 是什么给了我 nil 我认为这会奏效,我之前在我的一次搜索中看到过,但问题是我收到警告说它已被弃用......但现在,是的,我得到了一个有效的与 AVPlayerItem 一起使用的 URL。非常感谢!

以上是关于无法在 Alamofire response.result.value 中使用 NSURL!斯威夫特,xcode 7.3的主要内容,如果未能解决你的问题,请参考以下文章

似乎无法使用 Alamofire 获取缓存的响应

Swift 3 / Alamofire:无法用数据加载表格

为啥我无法从 Alamofire 获取请求结果

POST 请求在 swift3 中无法使用 alamofire

无法使用我在 Alamofire 完成块中分配的值

Alamofire 4:无法调用非函数类型“HTTPURLResponse?”的值