Индикатор активности при просмотре одной таблицы загружает другую

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

[self.navigationController pushViewController:subKeywordController animated:YES];

. Затем этот контроллер выполняет довольно интенсивный SQL-запрос

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

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

bool _WebTryThreadLock (bool), 0x1d79b0: Попытка получить веб-блокировку из потока, отличного от основного потока или веб-потока. Это может быть результатом обращения к UIKit из вторичного потока. Авария сейчас ...

Приложение работает на iPhone, но вылетает симулятор.

Любая помощь будет принята с благодарностью.

1
задан Matt 19 August 2010 в 11:58
поделиться

1 ответ

Проблема в том, что ваша задача в контроллере задерживает код пользовательского интерфейса (но вы, вероятно, уже знаете это!). Дешевый и простой способ решить эту проблему - поставить крошечную задержку на запуск вашей медленной задачи (в данном случае SQL-запроса) с помощью таймера :

- (void)viewDidLoad {
    [super viewDidLoad];

    // instead of running the SQL here, run it in a little bit
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doSQL:) userInfo:nil repeats:NO];

    // Show the please wait stuff
    [activityIndicator setHidden:NO];
}

- (void)doSQL:(NSTimer *)timer {
    // Do your sql here
}

Другой способ решить эту проблему - переместить ваш SQL в отдельный поток :

- (void)viewDidLoad {
    [super viewDidLoad];

    // instead of running the SQL here, run it in a little bit
    [self performSelectorInBackground:@selector(doSQL) withObject:nil];

    // Show the please wait stuff
    [activityIndicator setHidden:NO];
}

- (void)doSQL {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Do your sql here

    // Tell the main thread
    [self performSelectorOnMainThread:@selector(doneSQL) userInfo:nil waitUntilDone:YES];

    // Cleanup
    [pool release];
}

- (void)doneSQL {
    // Update your UI here
}

Надеюсь, это поможет!

2
ответ дан 2 September 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: