2016-08-19 37 views
1

我有一個媒體播放器應用程序,我正在處理,並且我正在發送一個Alamofire請求來獲取URL形式的字符串......當我收到響應時,我確實收到它作爲一個字符串,但是當我嘗試將它轉換成一個NSURL時,我總是得到零。無法在Alamofire response.result.value中使用NSURL! Swift,xcode 7.3

請求爲:

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爲零)。

現在我相信這與請求是異步的有關,但我想知道如果任何人有任何想法如何得到這個工作?

我將不勝感激您的幫助。

編輯使用完成處理程序:

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,因爲這將是nil因爲該進程是異步的,並且該變量根本沒有更新。您可以在完成處理包裝這和使用像這樣:

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 
} 
+0

感謝您抽出時間來回答!我有一個鬼鬼祟祟的懷疑我需要使用「完成處理程序」......我只是在想我必須使用NSNotifications和觀察者......但這似乎是一個好主意......我會在一段時間內測試一下並回復給您 – Agustin

+0

我在原始文章中添加了你的示例,並且在嘗試將字符串轉換爲NSURL後,仍然發現無錯誤... – Agustin

+0

'Url in'後面的'print(theUrl)'並查看它是否顯示nything? – Dershowitz123

相關問題