UIActivityIndicatorView не отображается несмотря на многопоточность - PullRequest
3 голосов
/ 22 февраля 2011

Я пытался реализовать это в течение длительного времени, и я не получил положительных результатов.

Скажите, что у меня есть метод, в котором выполняется HTTP-запрос (в частности, обновление Twitter), и скажите, что я хочу отображать UIActivityIndicatorView, пока выполняется HTTP-запрос (я знаю, когда он выполняется, потому что являются методами делегата, которые вызываются, когда запрос выполнен, либо с положительным результатом, либо с отрицательным).

Я видел много ответов, в которых говорится, что для реализации этого класса необходима многопоточность. Сначала я попытался вызвать метод startAnimating в другом потоке и метод stopAnimating напрямую (без запуска нового потока). После этого я увидел, как этот парень делает это, и подумал, что это безопаснее, когда я запускал и останавливал индикатор двумя разными способами (методы делегата для обновления в твиттере).

Однако ни один из этих двух способов сделать это не дал мне желаемых результатов (индикатор активности вообще не отображается). Я что-то пропускаю?

Заранее спасибо, и я прошу прощения, если мой вопрос слишком длинный.
Ваша помощь очень ценится.

Ответы [ 3 ]

4 голосов
/ 22 февраля 2011

Потоки абсолютно запрещены при работе с подклассами UIKit. Возможно, вы видели отчеты о том, что UIActivityIndicatorView использует внутреннюю многопоточность, но это никоим образом не означает, что вы можете получить доступ к объекту из нескольких потоков. Все подклассы UIView (включая UIActivityIndicatorView) должны быть доступны только из основного потока. Это включает в себя звонки -startAnimating и -stopAnimating.

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

0 голосов
/ 22 февраля 2011

MBProgressHUD это также просто и показывает и прячется, когда вторичный поток запущен / закончен.Примерно так:

[HUD showhileexecuting:"yourstuff" animated:YES]

"Yourstuff" будет выполняться в отдельном потоке.

Не следует выполнять действия пользовательского интерфейса во вторичном потоке.

0 голосов
/ 22 февраля 2011

Вы не можете выполнять пользовательский интерфейс во вторичном потоке.

Вы должны выполнить свой HTTP-запрос во вторичном потоке, одновременно вызывая представление активности из основного потока.

Я рекомендую использовать DSActivityView , который намного проще в использовании. Всего 1 строка для отображения вида активности, 1 строка для скрытия.

...