2016-07-19 18 views
1

Ich implementiere eine Logik, um zu prüfen, ob ein Kontakt in der Kontaktliste existiert und auf Basis dieses Ergebnisses füge ich den Kontakt ein. Meine bisherigen Fortschritte:Überprüfen Sie, ob eine Kontaktnummer in der Kontaktliste mit CNContacts in iOS existiert

__block NSString *strPhoneNumber = @"1093874652"; 

if ([CNContactStore class]) { 
    CNContactStore *addressBook = [[CNContactStore alloc] init]; 

    NSArray *keysToFetch [email protected][CNContactPhoneNumbersKey]; 
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 


    NSError *error = nil; 
    CNContactFetchRequest *fetchRequest =[[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch]; 

    __block BOOL isExists = NO; 

    [addressBook enumerateContactsWithFetchRequest:fetchRequest error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) { 

    NSArray *phoneNumbers =[[contact.phoneNumbers valueForKey:@"value"] valueForKey:@"digits"]; 


    if ([phoneNumbers containsObject:strPhoneNumber]) { 
     isExists = YES; 
     *stop = YES; 
    } 
    else 
     isExists = NO; 

    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

    if (isExists == NO) { 
    //This is the method for saving the contacts. I'm not implementing here.      
    [self saveContactWithName:@"John Doe" withContactEmail:@"[email protected]@" withContactPhone:str];         
    } 

    }); 
    }); 
} 

Nun ist das Problem nach aufzählt, den Code unter if (isExists == NO) Brände mehrmals und Speichern der Kontakt mehrere times.How kann ich es stoppen? Mein einziger Bedarf ist, wenn der Kontakt beendet wird, dann speichern Sie ihn nicht, andernfalls speichern Sie ihn nur einmal. Jede Hilfe wird geschätzt.

+0

Warum die zweite 'dispatch_async()'? Warum nicht einfach speichern, anstatt "isExists" zu setzen? – Droppy

+0

von Ihrem Code 'if ([phoneNumbers enthältObjekt: strPhoneNumber])' wird immer falsch sein, da 'strPhoneNumber' Instanz nicht in' phoneNumbers' Elemente vorhanden ist. Sie müssen die Zeichenkettengleichheit mit Prädikat oder etwas dort prüfen. – Akhilrajtr

+0

@Droppy: Sie brauchen keine zweite 'dispatch_async()'. Ich werde es fallen lassen. – Poles

Antwort

1

den unten Teil in Ihrem Code ersetzen,

NSArray *phoneNumbers = [[contact.phoneNumbers valueForKey:@"value"] valueForKey:@"digits"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self == [c] %@", strPhoneNumber]; 
NSArray *filtered = [phoneNumbers filteredArrayUsingPredicate:predicate]; 
if ([filtered count] > 0) { 
    isExists = YES; 
    *stop = YES; 
} 
else 
    isExists = NO; 

}]; 
+0

Ok, ich werde es versuchen. – Poles

+0

Ich denke, 'wie [c]' kann durch '== [c]' ersetzt werden, die Antwort zu aktualisieren – Akhilrajtr