2016-08-19 14 views
1

私は働いているメディアプレーヤーアプリを持っていて、文字列の形でURLを取得するAlamofireリクエストを送信しています...応答を受け取ったとき、正しく受信しました文字列ですが、それをNSURLに変換しようとすると、何も得られません。Alamofire response.result.valueでNSURLを使用できません!スウィフト、xcode 7.3

要求がある:私のURLStringは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!)") 
      self.URLToPlay = response.result.value! 
    } 

、私URLToPlayもStringです。私がNSURLに変換するために使用する コマンドは

let streamingURL = NSURL(string: self.URLToPlay) 

である私はURLToPlayに有効なURLに見える文字列を取得、私はブラウザわたしの文字列を受け取っ/ペーストをコピーした場合、実際には、私はメディアを再生することができています...私はそれを使用してNSURLに変換すると、私のアプリケーションがクラッシュする(streamingURLがnilであるため)。

これはリクエストが非同期であることと関係していると思いますが、これをどうやって取得するか考えている人はいますか?

私はあなたの助けに大変感謝します。

編集完了ハンドラを使用する:それはnilになりますので、これはAsyncプロセスであり、あなたがAlamofireURLToPlayOUTSIDE.GET機能を使用するに関係なく、それは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

をプロセスは非同期であり、変数はまだ更新されていないためです。あなたは完了ハンドラでこれを包むので、のように使用することができます。

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

'theUrl in'の後に' print(theUrl) 'と表示されます。何か? – Dershowitz123

関連する問題