Как остановить безудержные процессы - PullRequest
0 голосов
/ 03 мая 2011

Итак, я работаю над этим приложением, которое запрашивает и получает контент веб-сервиса для iPhone.Проблема, с которой я сталкиваюсь, заключается в следующем: когда я первоначально запрашиваю данные, они создаются как независимый поток, поэтому приложение не перестает отвечать на запросы из-за медленной работы сети.Это означает, что если пользователь уходит с текущей страницы до того, как эти данные заканчивают загрузку, могут произойти непредвиденные ситуации.

Мне удалось сузить проблемные случаи до одной относительно простой: у меня есть несколько вложенных таблиц, так что если пользователь переходит в таблицу «Сообщения», которая иногда может занять некоторое время для загрузки,затем сразу же вернитесь назад и выберите другой набор сообщений для просмотра; предыдущий набор сообщений заканчивается загрузкой, поскольку он все еще находится в очереди.

Вот что я пробовал:

1) Я пытался отменить операции, но это бесполезно, потому что, поскольку я разрешаю только одну операцию в очереди, она сразу срабатывает

2) Я попытался проверить, что получатель данных совпадает, но это не работает, потому что фактический объект таблицы находится между двумя выборами, ему просто нужен другой набор данных.

У кого-нибудь есть общие предложения по программированию о том, как решить эту хитрую проблему с многопоточностью?

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

Спасибо!

1 Ответ

1 голос
/ 03 мая 2011

В этом посте есть несколько советов по дизайну, касающихся работы с сетями iOS и создания потоков.Основная суть этого - «Не используйте явные потоки», и я не мог согласиться с этим. NSURLConnection имеет отличные встроенные функции для асинхронной загрузки данных с URL-адреса и управления всеми потоками за вас.Они также могут быть легко отменены по желанию.

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

...