J'ai un petit sqlitedb dans mon appareil iOS. Lorsqu'un utilisateur appuie sur un bouton, je récupère les données de sqlite et je les montre à l'utilisateur.
Cette partie de récupération, je veux le faire dans un thread d'arrière-plan (pour ne pas bloquer le thread principal de l'interface utilisateur). Je fais ça comme ça -
[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];
Après la récupération et un peu de traitement, je dois mettre à jour l'interface utilisateur. Mais puisque (comme bonne pratique), nous ne devons pas effectuer de mise à jour de l'interface utilisateur à partir des threads d'arrière-plan. J'appelle un selector
fil principal comme ça -
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
Mais mon application plante dans la première étape. c'est-à-dire démarrer un fil d'arrière-plan. N'est-ce pas un moyen de démarrer des threads d'arrière-plan dans iOS?
MISE À JOUR 1: Après [self performSelectorInBackground....
avoir obtenu ce stacktrace, aucune information quoi que ce soit -
MISE À JOUR 2: J'ai même essayé de démarrer un fil d'arrière-plan comme celui-ci -
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
mais j'obtiens toujours le même stacktrace.
Juste pour que je clarifie, lorsque j'effectue cette opération sur le fil principal, tout se passe bien ...
MISE À JOUR 3 C'est la méthode que j'essaie d'exécuter en arrière-plan
- (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
est conservé.
docids
sont retain
. Je l'ai mis en .h
tant que@property (nonatomic, retain) NSMutableArray *docids;
get
; ça devrait juste êtreresultSetFromDB: