2016-02-05 3 views
0

J'essaye de mettre en application une application de contact.NSOperationQueue .... sélecteur non reconnu envoyé

Dans MyContactsViewController, j'essaie d'accéder aux contacts et si l'accès est accordé, je vais chercher les contacts de mon carnet d'adresses. Le ContactHandler est ma classe de modèle (singleton) qui a la méthode appelée getAllContacts pour obtenir les contacts dans un NSMutableArray.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    contactHandler = [ContactHandler sharedInstance]; 
    if(!self.accessGranted){ 
     NSOperationQueue *queue =[[ NSOperationQueue alloc]init]; 
     [queue performSelectorOnMainThread:@selector(getAccessToAddressBook) withObject:self waitUntilDone:YES]; 
     contactList = [contactHandler getAllContacts]; 
    } 
    else{ 
     contactList = [contactHandler getAllContacts]; 
    } 

} 

-(BOOL)getAccessToAddressBook{ 

    CNContactStore * contactStore = [[CNContactStore alloc] init]; 

    if([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusNotDetermined){ 

     [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { 
      if(granted){ 
       self.accessGranted = YES; 
      } 
      else{ 
       self.accessGranted = NO; 
      } 
     }]; 
    } 
    else if([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]== CNAuthorizationStatusAuthorized){ 
     self.accessGranted = YES; 
    } 
    else{ 
     self.accessGranted = NO; 
    } 
    return self.accessGranted; 
} 

Mais je reçois cette erreur -

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSOperationQueue getAccessToAddressBook]: unrecognized selector sent to instance 0x137630700' 

Quelqu'un peut-il s'il vous plaît aider.

+0

'[file d'attente performSelectorOnMainThread: @selector (getAccessToAddressBook) withObject: self waitUntilDone: YES]; 'Que voulez-vous faire exactement? C'est la ligne qui cause le problème. – Larme

+0

En appuyant sur cmd + clic, ça va à la méthode? Essayez aussi d'attendreUntilDone: NO – Hima

+0

J'essaie d'obtenir la permission avant d'aller chercher les contacts. Fondamentalement, je veux appeler la méthode getAllContacts après avoir reçu une réponse de la méthode getAccessToAddressBook. – Natasha

Répondre

1

Votre problème est cette ligne:

[queue performSelectorOnMainThread:@selector(getAccessToAddressBook) withObject:self waitUntilDone:YES]; 

Vous demandez queue d'effectuer getAccessToAddressBook quand est self qui a ce sélecteur

Si vous souhaitez exécuter la méthode getAccessToAddressBook sur la file d'attente, vous pouvez utiliser - addOperationWithBlock:

0

Comme dans cette ligne: performSelectorOnMainThread vous passez withObject:self, où, comme dans la définition méthode (BOOL)getAccessToAddressBook-à-dire que vous ne l'utilisez pas, ce qui est à l'origine du crash, alors assurez-withObject:nil, si vous ne voulez pas passer un objet ou de la valeur à la méthode.

Modifier cette ligne: -

[queue performSelectorOnMainThread:@selector(getAccessToAddressBook) withObject:self waitUntilDone:YES]; 

à ceci: -

[queue performSelectorOnMainThread:@selector(getAccessToAddressBook) withObject:nil waitUntilDone:YES]; 

Ou la meilleure approche sera d'écrire comme ceci: -

NSOperationQueue *opQueue=[NSOperationQueue new]; 
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(getAccessToAddressBook) object:nil]; 
[opQueue addOperation:op ]; 
+0

Je l'ai changé à zéro mais il me donne toujours la même erreur. – Natasha