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 les affiche à l'utilisateur.
Cette partie de récupération, je veux la faire dans un thread d'arrière-plan (pour ne pas bloquer le thread principal de l'interface utilisateur). Je fais cela comme suit
[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 comme (en tant que bonne pratique) nous ne devrions pas effectuer la mise à jour de l'interface utilisateur à partir de threads d'arrière-plan. J'appelle un selector
sur le fil principal comme ça -
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
Mais mon application se plante à la première étape, c'est-à-dire au démarrage d'un fil d'arrière-plan. N'y a-t-il pas un moyen de lancer des threads en arrière-plan dans iOS ?
UPDATE 1 : Après [self performSelectorInBackground....
Je reçois cette trace de pile, sans aucune information.
UPDATE 2 : J'ai même essayé, en commençant un fil de fond comme ceci - [NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
mais je reçois toujours la même trace de pile.
Pour que ce soit clair, lorsque j'effectue cette opération sur le fil principal, tout se passe bien...
MISE À JOUR 3 Voici la méthode que j'essaie d'exécuter à partir de l'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;
}
0 votes
Quel journal d'erreurs ou de pannes obtenez-vous ?
0 votes
Veuillez voir mes mises à jour...
0 votes
Pouvez-vous montrer la méthode que vous appelez en arrière-plan ? Et assurez-vous que l'objet
docids
est conservé.0 votes
Oui,
docids
sontretain
. Je l'ai mis dans.h
comme@property (nonatomic, retain) NSMutableArray *docids;
0 votes
Ne préfixez pas les méthodes avec
get
; cela devrait juste êtreresultSetFromDB: