У меня на устройстве iOS есть небольшой sqlitedb. Когда пользователь нажимает кнопку, я извлекаю данные из 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;
}
источник
docids
сохранился.docids
естьretain
. Я вставил это.h
как@property (nonatomic, retain) NSMutableArray *docids;
get
; это должно быть простоresultSetFromDB:
Ответы:
Если вы используете ,
performSelectorInBackground:withObject:
чтобы породить новый поток, то выполняется селектор отвечает за создание нового потока autorelease бассейн, цикл выполнения и другие сведения о конфигурации - см «Использование NSObject на нерест тему» в компании Apple Threading Руководство по программированию .Однако вам, вероятно, будет лучше использовать Grand Central Dispatch :
GCD - это более новая технология, более эффективная с точки зрения накладных расходов на память и строк кода.
Обновлено с помощью подсказки Крису Нолету , который предложил изменение, которое упрощает приведенный выше код и соответствует последним примерам кода GCD от Apple.
источник
[NSThread detachNewThreadSelector:@selector....
также к?performSelectorInBackground:withObject:
«аналогичен вызовуdetachNewThreadSelector:toTarget:withObject:
методаNSThread
с текущим объектом, селектором и объектом параметра в качестве параметров».(unsigned long)NULL
и0
в этом вопросе?Что ж, с GCD это довольно просто. Типичный рабочий процесс будет примерно таким:
Чтобы узнать больше о GCD, вы можете ознакомиться с документацией Apple здесь.
источник
Включите NSZombieEnabled, чтобы знать, какой объект освобождается, а затем к нему осуществляется доступ. Затем проверьте,
getResultSetFromDB:
имеет ли это какое-то отношение к этому. Также проверьте,docids
есть ли что-нибудь внутри и сохраняется ли это.Таким образом, вы можете быть уверены, что все в порядке.
источник
[self getResultSetFromDB:docids];
. Also when I try to call this method from background thread I do not reach
SpotMain * mirror ... `, он вылетает вскоре после входа в фоновый поток ...Библиотека sqlite по умолчанию, поставляемая с iOS, не компилируется с использованием макроса SQLITE_THREADSAFE в. Это может быть причиной сбоя вашего кода.
источник
Ответ Swift 2.x:
источник