У меня есть маленький 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;
}