Ho un piccolo sqlitedb nel mio dispositivo iOS. Quando un utente preme un pulsante, prendo i dati da sqlite e li mostro all'utente.
Questa parte di recupero voglio farlo in un thread in background (per non bloccare il thread principale dell'interfaccia utente). Lo faccio così -
[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];
Dopo il recupero e un po 'di elaborazione, devo aggiornare l'interfaccia utente. Ma poiché (come buona pratica) non dovremmo eseguire l'aggiornamento dell'interfaccia utente da thread in background. Chiamo un selector
su mainthread in questo modo -
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
Ma la mia app si arresta in modo anomalo nel primo passaggio. cioè l'avvio di un thread in background. Non è questo un modo per avviare i thread in background in iOS?
AGGIORNAMENTO 1: Dopo [self performSelectorInBackground....
aver ricevuto questo stacktrace, nessuna informazione come mai -
AGGIORNAMENTO 2: Ho anche provato ad avviare un thread in background in questo modo,
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
ma ottengo comunque lo stesso stacktrace.
Giusto per chiarire, quando eseguo questa operazione sul thread principale tutto gira liscio ...
AGGIORNAMENTO 3 Questo è il metodo che sto cercando di eseguire in background
- (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
venga conservato.
docids
sono retain
. L'ho inserito .h
come@property (nonatomic, retain) NSMutableArray *docids;
get
; dovrebbe essere soloresultSetFromDB: