Недавно я разработал iOS-приложение со Swift, которое обрабатывает множество фоновых HTTP-задач и обновляет не только пользовательский интерфейс, но и статические данные для текущего сеанса (множество массивов, переменных и т. д.) в соответствии с данными ответа. Меня можно считать новичком в iOS-разработке, и есть некоторые моменты, в которых я запутался:
Обновление пользовательского интерфейса из фоновой задачи выполняется через GCD API. Я всегда обрабатывал эти обновления, используя:
dispatch_async(dispatch_get_main_queue, {
// Update UI
})
Позвольте мне привести сценарий и пояснить мою точку зрения:
У меня есть контроллер представления с подвидом UITableView. Это табличное представление будет отображать список чего-либо (скажем, имена пользователей). Я подготовил и возобновил NSURLSessionDataTask:
let request = NSMutableURLRequest(URL: someURL)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
// Handle error case
// Parse data, and receive a user list
// AppData.userList = parsed list
// Update table view
}
Некоторые из моих тестировщиков столкнулись с некоторыми сбоями, связанными с диспетчерскими вызовами и циклами выполнения, в которых я не мог найти причину. Думаю, это связано с моими диспетчерскими звонками. Теперь я пересматриваю свой дизайн для этого, и вот мои вопросы:
- В чем разница между обновлением статических данных (массива, словаря и т. д.) внутри и вне вызова dispatch_async в основной очереди в обработчике завершения задачи http (в любом случае пользовательский интерфейс будет обновляться внутри вызова отправки, после обновления моих данных )?. Как я могу обеспечить потокобезопасность для фоновых потоков при чтении, вставке или удалении из массива?
- Может ли выполнение вызова dispatch_async внутри замыкания (для обработчика завершения задачи) вызвать какие-либо проблемы?
Любой четкий комментарий или руководство было бы очень полезно! Спасибо большое уже сейчас