2015-03-18 2 views
2

Я понимаю, что это было задано раньше, но предоставленные ответы просто не отвечали на мой вопрос.Возвращаемое значение из асинхронной функции из синхронной функции в Swift

У меня есть эта синхронная функция, numberOfRowsInSection для UITableView:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    var returnValue = 0 
    self.getFavorites() { result in 
     returnValue = result.count 
    } 
    return returnValue 
} 

и это getFavorites() функция:

func getFavorites(completionHandler: (([NSString])->())){ 
    let setter = self.xpcConnection?.remoteObjectProxy as FavoritesProtocol 
    setter.getFavorites({(reply) -> Void in 
     if var unwrappedReply = reply { 
      completionHandler(unwrappedReply) 
     } 
    }) 
} 

Сейчас функция numberOfRowsInSection возвращает 0, так как функция возвращает до того функция async завершается. Я понимаю эту концепцию.

Что не помогает мне в ответах, которые я нашел до сих пор, так это то, что никто из них не говорит о том, как вы можете вернуть значение, которое вы передаете обратно с помощью вашего completeHandler. У всех их есть очень простые примеры:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    self.getFavorites() { result in 
     println("Result count: " \(result.count)") 
    } 
} 

Отлично, если все, что вы делаете, это печать значения, но мне нужно вернуть значение!

Заранее спасибо

ответ

6

You «не может» возвращать результат блока асинхронной в синхронной функции. Я помещаю кавычки на «can not», потому что есть некоторые трюки, которые вы можете сделать, чтобы заставить их работать, но вы не должны делать их в 99,9% случаев, и только если вы точно знаете, что делаете.

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

Установить переменную:

var results: [String] = [] 

В видовом ли нагрузки, или где, звоните:

self.getFavorites() { results in 
    self.results = results 
    self.tableView.reloadData() 
} 

В вашем счетчике:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return results.count 
} 

Затем в ячейку для строки в индексный путь:

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