обновить интерфейс во время работы в цикле - PullRequest
0 голосов
/ 09 октября 2011

У меня есть текстовое поле только для чтения, которое я использую как отображение журнала.У меня есть операция, которая удаляет все файлы в каталоге документов приложения.Я хочу вставить строку журнала, когда я удаляю каждый файл.Но текстовое поле обновляется только после завершения всей операции.Как мне это исправить?

Вот мой код:

NSFileManager *fm = [[[NSFileManager alloc] init] autorelease];
NSError *error = nil;
for (NSString *fileName in array) {
    NSString *filePath = [DOCUMENT_PATH_VALUE stringByAppendingFormat:@"/%@", fileName];
    [fm removeItemAtPath:filePath error:&error];

    if (!error) {
        NSString *log = [NSString stringWithFormat:@"removed success: %@", fileName];
        [self logThis:log];
    }else{
        NSString *log = [NSString stringWithFormat:@"remove failed: %@, %@", fileName, [error localizedDescription] ];
        [self logThis:log];

-(void)logThis:(NSString*) text{
    NSRange range = NSMakeRange([updateLogTextView.text length], [text length]);
    updateLogTextView.text = [updateLogTextView.text stringByAppendingFormat:@"%@\n", text]; 

    [updateLogTextView scrollRangeToVisible:range];
}

Ответы [ 3 ]

0 голосов
/ 09 октября 2011

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

Пример:

- (void)processFiles:(NSArray *)array
{
    //You need to create your own autorelease pool in background threads:
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    //...
    NSString *log = ...;
    [self performSelectorOnMainThread:@selector(logThis:) withObject:log waitUntilDone:NO];
    //...
    [pool release];
}

Затем вы начнете свою операцию, используя:

[self performSelectorInBackground:@selector(processFiles:) withObject:files];

Другой вариант - использование Grand Central Dispatch с блоками.

Для получения более подробной информации см. Руководство по программированию потоков и Руководство по программированию параллелизма .

0 голосов
/ 09 октября 2011

Я только что запустил ios dev, но звучит так, как будто вам нужно перерисовать этот UIText. Я не уверен, как, хотя я предполагаю, что когда ваш журнал пишет, что вы можете освободить исходный объект UIText, realloc его и он должен перерисовать с новым сообщением журнала. Единственная проблема в том, что он, скорее всего, будет обновляться очень-очень быстро, поэтому перерисовка не будет стоить, если у ios нет функции сна?

Что-то вроде: Распределить и инициализировать текст Затем цикл for после каждой записи или нового сообщения в журнале освобождает ваш текст и realloc и инициализирует ваш текст

Это должно перерисовать объект UIText и обновить текст, если он не ожидает ошибку записи в память / сбой приложения

0 голосов
/ 09 октября 2011

Вам нужно изучить Threading и сделать этот вызов асинхронным. В настоящее время вы блокируете свой основной поток (при условии, что он оттуда вызывается). Вам нужно разделить их так, чтобы отдельный поток выполнял тяжелую операцию, пока ваш основной поток обновляется новым текстом в пользовательском интерфейсе.

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