2015-08-13 3 views
0

Я пытаюсь решить проблемы с http-запросом, потому что я почти не могу понять все о методах синхронизации и асинхронности. Я просто хочу знать, как я могу заставить компилятор ждать начала http-запроса и только потом продолжить выполнение?Отправка http-запроса в swift

Например, мне нужно получить некоторую страницу, проанализировать данные и отправить их другому. Но когда запрос, который публикует данные, обрабатываемые с первого запроса, выполняет сначала и только затем запрашивает, что выполняет анализ данных, - у меня есть большой butthurt.

ответ

1

Вам следует избегать синхронных сетевых запросов как чумы. Она не имеет две основных проблем:

  • Запрос блокирует ваш пользовательский интерфейс, если не вызывается из другого потока, который является большим нет-нет для большого приложения качества (ну, для любого приложения на самом деле)
  • Существует не способа, как отменить этот запрос исключением случаев, когда ошибки на своей собственной

Я предлагаю вам использовать некоторые хорошо написанные библиотеки для сетевых запросов, например 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) 
      } 

Надеюсь, это поможет!

+0

это замечательно, спасибо. – SwiftStudier

+0

Добро пожаловать :) –

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