2016-04-18 2 views
0

Я пытаюсь проверить пользователя моего приложения, когда они открывают приложение. У меня есть заставку, которая отправляет сообщение электронной почты пользователям на сервер и на основании ответа от сервера он либо загрузит домашний просмотр, либо страницу проверки электронной почты.Как сделать сообщение на сервере, подождать ответа, а затем изменить представление на основе ответа в Swift?

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

Я пытался использовать:

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) 

и

 let task = session.dataTaskWithRequest(request) 
     { 
     //more stuff to handle return 
     } 
      task.resume() 

а также

NSURLConnection.sendSynchronousRequest() 

Проблема с первым и третьим вариантом является то, что они являются устаревшими методами, в дополнение к ним, работающим над собственным потоком, и получение ответа после того, как оператор if изменил представление уже побежал.

Это фрагмент коды используется:

 //returns the email of the user 
     let email = self.fileCom.getUserStringField("email") 


     //write the string to post to the server 
     let post = "email=" + email + 
        "&pass=" + self.serverCom.PASSWORD 

     //post the user email to verification script and log result 
     logResponse(self.serverCom.postToServer(self.serverCom.getVerifyEmailScriptURL(), bodyData: post)) 

     //Check the status of verified and email 
     // if(self.fileCom.getUserBoolField("verified")) 
     if(false)//temp 
     { 
      //change view to home view 
      print("\nHomeView\n") 
      showHomeView() 
     } 
     else 
     { 
      //change view to verification view 
      print("\nVerifyView\n") 
      showVerificationView() 
     } 

если заявление, чтобы изменить вид основано на хранимый ответ от сервера к файлу пользователя в папке документов.

+0

Вы должны показать представление в обработчик завершения для сетевого вызова. –

ответ

2

NSURLSession - текущий поддерживаемый способ перехода сюда. С помощью NSURLSession вы можете создать класс, который реализует свои методы делегата для объявления в качестве его делегата, или вы можете использовать блоки/блокировки. «Блоки» в C/Obj-C тщательно сопоставляются с «Закрытиями» в Свифте. Они позволяют вам выполнять функции, как если бы они были переменными. Вы можете использовать NSURLSession 's -dataTaskWithRequest:completionHandler:, чтобы выполнить это.

Завершение блока Handler будет выполняться (в очереди делегатов сеанса) при завершении загрузки. Оттуда вы можете действовать в ответ.

Вот краткий пример его использования (с некоторыми примечаниями):

let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { 
// Don't put other code before this next line, it is defining the closure we just started with the "{" 
(data, response, error) -> Void in 
    // This is where the closure body begins 
    print(NSThread.isMainThread()) // false (unless you've set the delegate queue to be the main queue) 

    // Example of processing the return value 
    let dataString = NSString.init(data: data!, encoding: NSUTF8StringEncoding) 
    print(dataString) // Okay to do work with this here, but don't do any UI work. 

    // Jump back over to the main queue to do any UI updates 
    // UI updates must always be done on the main queue 
    dispatch_async(dispatch_get_main_queue(), { 
     print(NSThread.isMainThread()) // true (we told it to execute this new block on the main queue) 
     // Execute the code to update your UI (change your view) from here 
     myCoolUIUpdatingMethod(dataString) 
    }); 

    // anything down here could be executed before the dispatch_async block completes 
    // dispatch_sync would block this thread until its block completes 
}); 

// run the task 
task.resume() 

// your program's main thread will not be blocked while the load is in progress 
+0

Итак, я добавил это в свой код, и он не запускался. Я поставил оператор печати до и после строки «let task» и только оператор print перед его выполнением. –

+0

Также я добавил task.resume() после последнего ");" для выполнения задачи. Но это все еще после изменения вида. –

+0

Я только что редактировал свой пост, чтобы прояснить некоторые вещи. Если ваш второй оператор печати был там, где я прокомментировал «Не ставьте другой код перед следующей строкой ...», поэтому он не запускался. Это эффективно внутри заголовка закрытия, что не работает. Если вы поместили печать внутри «dispatch_async (dispatch_get_main_queue(), {», где у меня есть вторая печать, чтобы показать, что это главный поток, работает ли это? –

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