У меня есть маленький sqlitedb на моем устройстве iOS. Когда пользователь нажимает кнопку, я беру данные из sqlite и показываю их пользователю.
Эта получаемая часть я хочу сделать это в фоновом потоке (чтобы не блокировать основной поток пользовательского интерфейса). Я делаю это так:
[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];
После извлечения и обработки немного мне нужно обновить интерфейс. Но поскольку (как хорошая практика), мы не должны выполнять обновление пользовательского интерфейса из фоновых потоков. Я называю selector
на mainthread так:
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
Но мое приложение падает на первом шаге. то есть начать фоновый поток. Разве это не способ начать фоновый поток в iOS?
ОБНОВЛЕНИЕ 1: После [self performSelectorInBackground....
я получаю этот стек, нет информации о том, что когда-либо было -
ОБНОВЛЕНИЕ 2: Я даже пробовал, запустив фоновый поток вроде так -
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
, но все же я получаю ту же стек.
Просто чтобы уточнить, когда я выполняю эту операцию в основном потоке, все работает плавно...
ОБНОВЛЕНИЕ 3 Это метод, который я пытаюсь запустить из фона
- (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids
{
SpotMain *mirror = [[SpotMain alloc] init];
NSMutableArray *filteredDocids = toProceessDocids;
if(![gMediaBucket isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1];
if(![gMediaType isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType numRes:-1];
if(![gPlatform isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForPlatformID:filteredDocids platformId:@"1" numRes:-1];
self.resultSet = [mirror FetchObjectFromDocid:filteredDocids];
[filteredDocids release];
[mirror release];
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
return;
}