Я пытался около дня получить ячейку таблицы для отображения индикатора активности, пока она загружает новое представление. После didSelectRowAtIndexPath я хотел бы отобразить индикатор во время следующих запусков
[self.navigationController pushViewController:subKeywordController animated:YES];
. Затем этот контроллер выполняет довольно интенсивный SQL-запрос
. Я искал в Интернете и прочитал десятки сообщений, но ни одна из них, похоже, не помогла в моей конкретной проблеме. Я понимаю, что мне нужно запустить индикатор в другом потоке, потому что push и последующая загрузка имеют приоритет, но я не уверен, как это сделать. Я думал о запуске SQL-запроса в контроллере раньше, но это становится очень грязным.
Странно то, что я использовал MBProgressHUD для отображения занятых курсоров в этом же табличном представлении без проблем. Только когда я применяю поиск и затем выбираю один из результатов, который вызывает эту ошибку:
bool _WebTryThreadLock (bool), 0x1d79b0: Попытка получить веб-блокировку из потока, отличного от основного потока или веб-потока. Это может быть результатом обращения к UIKit из вторичного потока. Авария сейчас ...
Приложение работает на iPhone, но вылетает симулятор.
Любая помощь будет принята с благодарностью.
Проблема в том, что ваша задача в контроллере задерживает код пользовательского интерфейса (но вы, вероятно, уже знаете это!). Дешевый и простой способ решить эту проблему - поставить крошечную задержку на запуск вашей медленной задачи (в данном случае 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
}
Надеюсь, это поможет!