Вам следует избегать синхронных сетевых запросов как чумы. Она не имеет две основных проблем:
- Запрос блокирует ваш пользовательский интерфейс, если не вызывается из другого потока, который является большим нет-нет для большого приложения качества (ну, для любого приложения на самом деле)
- Существует не способа, как отменить этот запрос исключением случаев, когда ошибки на своей собственной
Я предлагаю вам использовать некоторые хорошо написанные библиотеки для сетевых запросов, например Alamofire или AFNetworking. Для Swift и того, что вы пытаетесь выполнить, я бы порекомендовал Alamofire, так как он FAR более прост в использовании и покрывает все основные вещи, которые вам нужны.
Вы можете выполнять основные запросы, как это:
// Perform GET request
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["key": "value"])
.response { request, response, data, error in
// Do something with response or error
println(response)
println(error)
}
Теперь, как на ваш вопрос, вы всегда можете заблокировать пользовательский интерфейс, пока работа сети не будет завершена, будь то откладывая performSegue, или просто запрещая «Next» , пока вы не получите ответ, или просто с помощью наложения с индикатором выполнения/счетчиком, например, с помощью SVProgressHUD library. Объединенные все вместе, вы можете сделать это следующим образом:
// Show progress HUD. This disables user interaction by default
SVProgressHUD.show()
// Perform GET request
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["key": "value"])
.response { request, response, data, error in
// Do something with response or error
println(response)
println(error)
// Hide progress to enable user interaction again
SVProgressHUD.dismiss()
// Or optionally perform transition to different controller here
self.performSegueWithIdentifier(identifier, sender: nil)
}
Надеюсь, это поможет!
это замечательно, спасибо. – SwiftStudier
Добро пожаловать :) –