Поместите логическое значение False в runloop, пока - PullRequest
1 голос
/ 12 июля 2011

Я пытаюсь получить список файлов каталога с моего ftp-сервера, используя библиотеку Chilkat. В этом случае я хочу анимировать UIActivityIndicatorView, когда процесс выполняется. Но проблема в том, что UIActivityIndicatorView никогда не начинает анимироваться. Код, который я использую:

[self.activityIndicator startAnimating];
[selfgetListFromPath:ftpPath withConnection:ftpConnect];
[self.activityIndicator stopAnimating];

activityIndicator - это объект UIActivityIndicatorView, ftpPath - это NSString моего пути к файлу на FTP-сервере, а getListFromPath - это метод получения списка с FTP-сервера с использованием алгоритма Chilkat, ftpConnect - это объект Класс FTP-соединения.

Я пытался использовать NSRunLoop до вызова функции getListFromPath, поэтому я изменил свой код на:

[self.activityIndicator startAnimating];

BOOL waitingOnProcessing = YES;
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
while (waitingOnProcessing && [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) {

}

[self getListFromPath:ftpPath withConnection:ftpConnect];
[self.activityIndicator stopAnimating];

это делает анимацию activityIndicator, но getListFromPath никогда не срабатывает. После испытания я решил снова изменить свой код на:

[self.activityIndicator startAnimating];

    BOOL waitingOnProcessing = YES;
    NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
    while (waitingOnProcessing && [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) {
        waitingOnProcessing = NO;       
    }

    [self getListFromPath:ftpPath withConnection:ftpConnect];
    [self.activityIndicator stopAnimating];

делает анимацию activityIndicator, а также запускает функцию getListFromPath. Но я сомневаюсь с этим кодом, я прав с этим кодом? или, может быть, есть плохая практика для использования NSRunLoop? может кто-нибудь сказать мне

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 июля 2011

Этот код работает как «черный ящик»:

[self.activityIndicator startAnimating];
[self getListFromPath:ftpPath];
[self.activityIndicator stopAnimating];

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

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

Используйте эти методы:

[NSObject performSelectorInBackground:withObject:]

, чтобы запустить ваш поток getListFromPath, затем, когда это будет сделано, вызовите

[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]

, чтобы вернуть управление главному потоку, что остановит анимацию вращения.

0 голосов
/ 12 июля 2011

Я не знаю библиотеку Chilkat, но у нее должен быть какой-то способ сообщить вам, что вы получаете ответ от вашего ftp-сервера.Когда вы его получите, вы должны использовать NSNotification или протокол, чтобы сообщить контроллеру представления, что вы получили ответ.Когда это произойдет, вы останавливаете спиннер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...