Mam mały sqlitedb na moim urządzeniu z iOS. Kiedy użytkownik naciska przycisk, pobieram dane z sqlite i pokazuję je użytkownikowi.
Ta część pobierania chcę to zrobić w wątku w tle (aby nie blokować głównego wątku interfejsu użytkownika). Robię to tak -
[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];
Po pobraniu i trochę przetworzeniu muszę zaktualizować interfejs użytkownika. Ale ponieważ (jako dobra praktyka) nie powinniśmy przeprowadzać aktualizacji interfejsu użytkownika z wątków w tle. Wzywam takiego selector
głównego wątku -
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
Ale moja aplikacja ulega awarii w pierwszym kroku. tj. rozpoczęcie wątku w tle. Czy to nie jest sposób na uruchamianie wątków w tle w iOS?
AKTUALIZACJA 1: Po tym, [self performSelectorInBackground....
jak otrzymam ten ślad stosu, nie ma żadnych informacji -
AKTUALIZACJA 2: Próbowałem nawet rozpocząć wątek w tle w ten sposób -
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
ale nadal otrzymuję ten sam ślad stosu.
Tylko dla wyjaśnienia, kiedy wykonuję tę operację na głównym wątku, wszystko działa gładko ...
UPDATE 3 To jest metoda, którą próbuję uruchomić w tle
- (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
jest zachowany.
docids
są retain
. Umieściłem to .h
jako@property (nonatomic, retain) NSMutableArray *docids;
get
; tak powinno byćresultSetFromDB: