无法在 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
进程,无论你在哪里使用URLToPlay
OUTSIDEAlamofire
的.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.URLQueryAllowedCharacterSet()) //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的主要内容,如果未能解决你的问题,请参考以下文章