2016-02-05 6 views
0

Я пытаюсь реализовать контактное приложение.NSOperationQueue .... нераспознанный селектор отправлен

В MyContactSViewController я пытаюсь получить доступ к Контакты, и если доступ будет предоставлен, я получаю контакты из моей адресной книги. ContactHandler - это мой модельный класс (singleton), который имеет метод, называемый getAllContacts, чтобы получить контакты в 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; 
} 

Но я получаю эту ошибку -

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

Может кто-нибудь пожалуйста, помогите.

+0

'[очереди performSelectorOnMainThread: @selector (getAccessToAddressBook) withObject: self waitUntilDone: YES]; 'Что вы хотите сделать точно? Это линия, вызывающая проблему. – Larme

+0

Нажав кнопку cmd + click, он переходит к методу? Также попробуйте waitUntilDone: NO – Hima

+0

Я пытаюсь получить разрешение, прежде чем я заберу контакты. В принципе, я хочу вызвать метод getAllContacts после получения ответа от метода getAccessToAddressBook. – Natasha

ответ

1

Ваша проблема это линия:

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

Вы просите queue выполнить getAccessToAddressBook, когда это self кто имеет этот селектор

Если вы хотите запустить метод getAccessToAddressBook на очереди, вы можете использовать - addOperationWithBlock:

0

Как и в этой строке: performSelectorOnMainThread вы передаете withObject:self, где, как и в методе определения, т.е. (BOOL)getAccessToAddressBook вы его не используете, что вызывает сбой, так что withObject:nil, если вы не хотите, чтобы передать любой объект или значение к методу.

Изменить эту линию: -

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

к этому: -

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

Или лучше подход будет писать так: -

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

Я изменил его на ноль, но он по-прежнему дает мне ту же ошибку. – Natasha

 Смежные вопросы

  • Нет связанных вопросов^_^