2016-08-19 5 views
1

У меня есть приложение для медиаплеера, над которым я работаю, и я отправляю запрос Alamofire для получения URL-адреса в виде строки ... когда я получаю ответ, я правильно его воспринимаю как строка, но когда я пытаюсь преобразовать ее в NSURL, я все равно получаю нуль.Невозможно использовать NSURL в Alamofire response.result.value! 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 является String, мой URLToPlay также строка. Команды я использую, чтобы преобразовать его в NSURL является

let streamingURL = NSURL(string: self.URLToPlay) 

Я получаю правильный URL вида строки в URLToPlay, на самом деле, если я копировать/вставить, получившую строку к браузеру, я могу играть СМИ ... но когда я использую его для преобразования в NSURL, мое приложение падает (из-за того, что streamingURL равен нулю).

Теперь я считаю, что это связано с тем, что запрос является асинхронным, но мне интересно, есть ли у кого-нибудь представление о том, как это сделать?

Я бы с благодарностью высказал вам свою помощь.

Edited использовать обработчик завершения:

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ВНЕ.GET функция Alamofire, она собирается вернуться 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

Я добавил к своему первоначальному сообщению ваш пример, и я все еще получаю сообщение об ошибке nil сразу после того, как попытаюсь преобразовать строку в NSURL ... – Agustin

+0

'print (theUrl)' после 'theUrl in' и посмотреть, показывает ли он nything? – Dershowitz123

Смежные вопросы