Отменяемая загрузка в фоновом потоке - PullRequest
2 голосов
/ 26 мая 2011

У меня есть окно, которое отображает некоторые данные в NSTableView.Эти данные загружаются в фоновом режиме.Поток загрузки данных запускается методом windowDidLoad:.Если окно закрыто до завершения загрузки, фоновый поток должен быть отменен.Я делаю это, сигнализируя поток в методе делегата windowWillClose: и ожидая завершения фонового потока.

Теперь все это работает отлично.Но у меня есть одна проблема: как я могу обновить данные в табличном представлении?Я попытался вызвать reloadData через performSelectorOnMainThread:, но это приводит к состоянию гонки: вызов reloadData иногда ставится в очередь в главном потоке после команды закрытия окна, и выполняется после закрытия окна, и все идет вверхв огне.

Каков наилучший способ управления фоновым потоком и связи с ним?

1 Ответ

3 голосов
/ 26 мая 2011

Ну, вы знаете, это именно то, что делает использование многопоточности сложным: вы всегда сталкиваетесь с проблемами синхронизации.

Я предлагаю вместо вызова [tableView reloadData] из вашего потока просто сигнализировать контроллеру(вызывая метод controllerShouldReloadTable) и позвольте вашему контроллеру проверить, был ли вызван windowWillClose или нет.Может быть вероятность того, что ваш контроллер также будет выпущен ко времени controllerShouldReloadTable, и чтобы исправить это, вам определенно понадобится retain контроллер из вторичного потока.

На стороне заметку, яотменял бы поток в viewDidUnload (для симметрии).

Самое важное: я бы использовал асинхронные вызовы и класс делегата, чтобы вся проблема многопоточности была решена в корне.

EDIT: Асинхронная отправка запроса не будет блокировать отправляющий поток, ожидающий ответа.Вместо этого асинхронная отправка (для NSURLConnection называется start) немедленно возвращается (поэтому блокировка отсутствует), и когда ответ получен, будет вызван метод делегата (т. Е. connectionDidFinishLoading:), чтобы вы могли обновить модельи пользовательский интерфейс.Взгляните на NSURLConnection документов, но, как обычно, я настоятельно рекомендую использовать [ASIHTTPRequest][2], который имеет много преимуществ .

...