2016-02-10 2 views
1

У меня есть кнопка, и когда я нажимаю он I'm вызова функции Async:Ждите метод асинхронного перед тем Segue

func check(url : String){ 
     let url = NSURL(string: url) 
     print("Checking") 
     dispatch_async(dispatch_get_main_queue(), { 
      let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in 
       if error == nil { 
        self.isWorking = true 
       } 
       else{ 
        self.isWorking = false 
        } 
       } 
      } 
      task.resume() 
     }) 
    } 

Так что, когда я нажимаю мою кнопку я делаю следующее:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!){ 
     let web = segue.destinationViewController as! ViewController() 

     check(url) 

     dispatch_async(dispatch_get_main_queue(), { 
       if (isWorking){ 
        // Do stuff 
       } 
     }) 
} 

Проблема заключается в том, что isWorking вызывается до завершения метода проверки.

Как я могу убедиться, что проверка завершена, прежде чем я сделаю свой чек для isWorking?

+0

вы хотите, чтобы выполнить переход только после того, как http-вызов? Если это так, вы можете добавить обратный вызов. – Brduca

+0

Да после http-вызова. – user5855868

ответ

2

Вы можете использовать "обработчик завершения":

func check(url : String, completion: (isWorking: Bool)->()) { 
    let url = NSURL(string: url) 
    print("Checking") 
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in 
     if error == nil { 
      completion(isWorking: true) 
     } 
     else{ 
      completion(isWorking: false) 
     } 
    } 
    task.resume() 
} 

И вы называете это так, с закрытием завершающим:

check(url) { (isWorking) in 
    if isWorking { 
     // do stuff 
    } else { 
     // not working 
    } 
} 
+1

Очень хороший ответ. огромное спасибо –

1

Это сделает работу:

import UIKit 

class AnyViewController: UIViewController 
{ 
    var isWorking = false 

    func check(url : String) 
    { 
     let url = NSURL(string: url) 
     print("Checking") 

     let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in 
      if error == nil 
      { 
      self.performSegueWithIdentifier("mySegueID", sender: nil) 
      } 
      else{ 
       self.isWorking = false 
      } 
     } 

     task.resume() 
    } 
} 
0

Вы можете отправлять уведомление слушателю для выполнения сеанса только в том случае, если задача завершена NSNotificationCenter.defaultCente г() postNotificationName. («имя», объект: ноль):

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Register a notification listener 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "customSegue:", name:"segue", object: nil) 
} 

func customSegue(notification: NSNotification){ 
    // Do stuff 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!){ 
    check(url) 
} 

func check(url : String){ 
    let url = NSURL(string: url) 
    print("Checking") 
    dispatch_async(dispatch_get_main_queue(), { 
     let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in 
      if error == nil { 
       self.isWorking = true 
       // Send a notification to the listener to perform stuff 
       NSNotificationCenter.defaultCenter().postNotificationName("segue", object: nil) 
      } 
      else{ 
       self.isWorking = false 
       } 
      } 
     } 
     task.resume() 
    }) 
} 

Таким образом, код в customSegue FUNC будет выполняться только тогда, когда ошибка == ноль

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