2016-08-19 22 views
5

Tôi chỉ muốn liên hệ tên và họ được cung cấp theo số điện thoại. Tôi đã thử điều này nhưng điều này là quá chậm và CPU là đánh hơn% 120.Liên hệ iOS Cách tìm nạp địa chỉ liên hệ theo số điện thoại

let contactStore = CNContactStore() 
      let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] 
      var contacts = [CNContact]() 
      do { 
       try contactStore.enumerateContactsWithFetchRequest(CNContactFetchRequest.init(keysToFetch: keys), usingBlock: { (contact, cursor) in 
        if (!contact.phoneNumbers.isEmpty) { 
         for phoneNumber in contact.phoneNumbers { 
          if let phoneNumberStruct = phoneNumber.value as? CNPhoneNumber { 
           do { 
            let libPhone = try util.parseWithPhoneCarrierRegion(phoneNumberStruct.stringValue) 
            let phoneToCompare = try util.getNationalSignificantNumber(libPhone) 
            if formattedPhone == phoneToCompare { 
             contacts.append(contact) 
            } 
           }catch { 
            print(error) 
           } 
          } 

         } 
        } 
       }) 
       if contacts.count > 0 { 
        contactName = (contacts.first?.givenName)! + " " + (contacts.first?.familyName)! 
        print(contactName) 
        completionHandler(contactName) 
       } 
      }catch { 
       print(error) 
      } 

Ngoài ra khi tôi sử dụng phonenumber Kit để tìm liên hệ với CPU tăng của nó và trả lời muộn.

var result: [CNContact] = [] 
     let nationalNumber = PhoneNumberKit().parseMultiple([phoneNumber]) 
     let number = nationalNumber.first?.toNational() 
     print(number) 

     for contact in self.addressContacts { 
      if (!contact.phoneNumbers.isEmpty) { 

       let phoneNumberToCompareAgainst = number!.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("") 
       for phoneNumber in contact.phoneNumbers { 
        if let phoneNumberStruct = phoneNumber.value as? CNPhoneNumber { 
         let phoneNumberString = phoneNumberStruct.stringValue 
         let nationalContactNumber = PhoneNumberKit().parseMultiple([phoneNumberString]) 
         let nationalContactNumberString = nationalContactNumber.first?.toNational() 
         if nationalContactNumberString == number { 
          result.append(contact) 
         } 
        } 
       } 
      } 
     } 

     return result 
+0

Bất kỳ đề xuất hoặc trợ giúp nào? –

+0

Đừng nghĩ rằng nó có thể – user3237732

+0

Tôi chỉ cố gắng để có được tên và họ từ số điện thoại và không thể có được nó? Thật thú vị vì vậy làm thế nào có thể whatsapp làm điều đó? –

Trả lời

13

Vấn đề với việc triển khai của bạn là bạn truy cập sổ địa chỉ trong mọi tìm kiếm bạn đang thực hiện.

Nếu thay vào đó bạn sẽ giữ trong bộ nhớ nội dung sổ địa chỉ sau lần truy cập đầu tiên, bạn sẽ không đạt được mức sử dụng CPU cao này.

  1. đầu tiên tổ chức một var lười biếng trong điều khiển của bạn sẽ giữ nội dung sổ địa chỉ:

    lazy var contacts: [CNContact] = { 
        let contactStore = CNContactStore() 
        let keysToFetch = [ 
         CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName), 
         CNContactEmailAddressesKey, 
         CNContactPhoneNumbersKey, 
         CNContactImageDataAvailableKey, 
         CNContactThumbnailImageDataKey] 
    
        // Get all the containers 
        var allContainers: [CNContainer] = [] 
        do { 
         allContainers = try contactStore.containersMatchingPredicate(nil) 
        } catch { 
         print("Error fetching containers") 
        } 
    
        var results: [CNContact] = [] 
    
        // Iterate all containers and append their contacts to our results array 
        for container in allContainers { 
         let fetchPredicate = CNContact.predicateForContactsInContainerWithIdentifier(container.identifier) 
    
         do { 
          let containerResults = try  contactStore.unifiedContactsMatchingPredicate(fetchPredicate, keysToFetch: keysToFetch) 
          results.appendContentsOf(containerResults) 
         } catch { 
          print("Error fetching results for container") 
         } 
        } 
    
        return results 
    }() 
    
    1. Duyệt qua mảng trong bộ nhớ khi bạn đang tìm kiếm cho một liên hệ có số điện thoại cụ thể:

    .

    func searchForContactUsingPhoneNumber(phoneNumber: String) -> [CNContact] { 
        var result: [CNContact] = [] 
    
        for contact in self.contacts { 
         if (!contact.phoneNumbers.isEmpty) { 
          let phoneNumberToCompareAgainst = phoneNumber.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("") 
          for phoneNumber in contact.phoneNumbers { 
           if let phoneNumberStruct = phoneNumber.value as? CNPhoneNumber { 
            let phoneNumberString = phoneNumberStruct.stringValue 
            let phoneNumberToCompare = phoneNumberString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("") 
            if phoneNumberToCompare == phoneNumberToCompareAgainst { 
             result.append(contact) 
            } 
           } 
          } 
         } 
        } 
    
        return result 
    } 
    

Tôi đã thử nghiệm nó với một sổ địa chỉ rất lớn, nó hoạt động trơn tru.

Đây là toàn bộ bộ điều khiển chế độ xem được ghép với nhau để tham khảo.

import UIKit 
import Contacts 

class ViewController: UIViewController { 

    lazy var contacts: [CNContact] = { 
     let contactStore = CNContactStore() 
     let keysToFetch = [ 
       CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName), 
       CNContactEmailAddressesKey, 
       CNContactPhoneNumbersKey, 
       CNContactImageDataAvailableKey, 
       CNContactThumbnailImageDataKey] 

     // Get all the containers 
     var allContainers: [CNContainer] = [] 
     do { 
      allContainers = try contactStore.containersMatchingPredicate(nil) 
     } catch { 
      print("Error fetching containers") 
     } 

     var results: [CNContact] = [] 

     // Iterate all containers and append their contacts to our results array 
     for container in allContainers { 
      let fetchPredicate = CNContact.predicateForContactsInContainerWithIdentifier(container.identifier) 

      do { 
       let containerResults = try contactStore.unifiedContactsMatchingPredicate(fetchPredicate, keysToFetch: keysToFetch) 
       results.appendContentsOf(containerResults) 
      } catch { 
       print("Error fetching results for container") 
      } 
     } 

     return results 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let contact = searchForContactUsingPhoneNumber("(555)564-8583") 
     print(contact) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func searchForContactUsingPhoneNumber(phoneNumber: String) -> [CNContact] { 

     var result: [CNContact] = [] 

     for contact in self.contacts { 
      if (!contact.phoneNumbers.isEmpty) { 
       let phoneNumberToCompareAgainst = phoneNumber.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("") 
       for phoneNumber in contact.phoneNumbers { 
        if let phoneNumberStruct = phoneNumber.value as? CNPhoneNumber { 
         let phoneNumberString = phoneNumberStruct.stringValue 
         let phoneNumberToCompare = phoneNumberString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("") 
         if phoneNumberToCompare == phoneNumberToCompareAgainst { 
          result.append(contact) 
         } 
        } 
       } 
      } 
     } 

     return result 
    } 
} 

Tôi đã sử dụng flohei's answer cho phần chữ cái lười.

+1

vâng Đó là nhanh nhưng nó không nhận được tất cả các số trong danh sách của tôi. Ví dụ tôi cần tìm nạp một số liên lạc nhưng tôi có số có mã quốc gia. Vì vậy, nếu liên hệ không được lưu theo mã quốc gia tôi không thể lấy nó. Tôi nên làm gì cho điều này –

+1

Thực ra đó là một câu hỏi khác với câu hỏi ban đầu mà bạn đã hỏi. Bạn có thể chỉ định dạng các con số mà người dùng nhập vào và các số từ sổ địa chỉ ở cùng một định dạng, bạn có thể sử dụng thư viện bên ngoài cho số đó (như https://github.com/marmelroy/PhoneNumberKit). –

+0

Một tùy chọn khác là xóa mã quốc gia - nếu nó tồn tại. Sau đó, chỉ cần so sánh số máy bay. –

Các vấn đề liên quan