2016-03-22 21 views
19

Tôi đang di chuyển một ứng dụng từ Khung danh bạ địa chỉ không dùng nữa sang Khung danh bạ mới. Ứng dụng sử dụng ABAddressBookRegisterExternalChangeCallback để được thông báo khi một ứng dụng khác thay đổi một số liên lạc.Khung liên hệ tương đương với ABAddressBook.ABAddressBookRegisterExternalChangeCallback

Tôi không thể tìm thấy chức năng tương đương trong Khung danh bạ. Tài liệu của Apple cho biết sử dụng trung tâm thông báo mặc định với the CNContactStoreDidChangeNotification notification:

Thông báo được đăng khi thay đổi xảy ra trong CNContactStore khác.

Lấy lời khuyên của Apple, mã của tôi trông như thế này:

NSNotificationCenter.defaultCenter().addObserver(
    self, 
    selector: "contactsChanged:", 
    name: CNContactStoreDidChangeNotification, 
    object: nil) 

Tuy nhiên, tôi đã tìm thấy hai vấn đề với cách tiếp cận này:

  1. Tôi thông báo cho tất cả thay đổi, bao gồm những người được thực hiện bởi ứng dụng của riêng tôi.
  2. Thông báo là giả mạo - Tôi nhận được nhiều thông báo cho một thay đổi duy nhất.

Nếu tôi đăng nhập mô tả debug được thông báo khi thay đổi đã được thực hiện trong ứng dụng của tôi, tôi nhận được một cái gì đó như thế này:

NSConcreteNotification 0x7d3370e0 {name = CNContactStoreDidChangeNotification; userInfo = { 
    CNNotificationOriginationExternally = 1; 
    CNNotificationSourcesKey =  (
    ); 
}} 

Và nếu những thay đổi được thực hiện bên ngoài:

NSConcreteNotification 0x7bf7a690 {name = CNContactStoreDidChangeNotification; userInfo = { 
    CNNotificationOriginationExternally = 1; 
    CNNotificationSourcesKey =  (
    ); 
}} 

Như bạn thấy, không có gì rõ ràng để phân biệt chúng.

Bất kỳ ai cũng có thể cho tôi biết cách nhận được hành vi tương tự từ Khung danh bạ như một người có thể nhận được từ ABAddressBookRegisterExternalChangeCallback?

+0

tự đang đề cập đến cá thể lớp, nơi bạn đang gọi phương thức này từ đó. – ogres

+0

@ chắc chắn, từ ngữ kém về phía tôi. Về cơ bản, đi qua trong 'tự' đạt được những gì tôi sau khi (chỉ nhận những thay đổi từ các ứng dụng bên ngoài)? Để làm việc đó, cái _type_ nào sẽ là 'self'? –

+0

tự có thể bằng bất kỳ loại nào, miễn là nó có addressBookDidChange: phương thức được khai báo. – ogres

Trả lời

0

Trước tiên, tôi khuyên bạn nên filing a bug with Apple về việc thiếu cách xác định các thay đổi bên trong và bên ngoài trong API.

Là một workaround có thể, bạn có thể thấy nếu unregistering quan sát của bạn trước khi thực hiện một sự thay đổi và đăng ký lại ngay sau đó đảm bảo rằng bạn bỏ lỡ tất cả các thông báo thay đổi của bạn và vẫn nhận được tất cả những người bên ngoài:

class ContactsThingy { 

    var observer: NSObjectProtocol? 
    let contacts = CNContactStore() 

    func contactStoreDidChange(notification: NSNotification) { 
     NSLog("%@", notification) 
    } 

    func registerObserver() { 
     let center = NSNotificationCenter.defaultCenter() 
     observer = center.addObserverForName(CNContactStoreDidChangeNotification, object: nil, queue: NSOperationQueue.currentQueue(), usingBlock: contactStoreDidChange) 
    } 

    func unregisterObserver() { 
     guard let myObserver = observer else { return } 
     let center = NSNotificationCenter.defaultCenter() 
     center.removeObserver(myObserver) 
    } 

    func changeContacts(request: CNSaveRequest) { 
     unregisterObserver() // stop watching for changes 
     defer { registerObserver() } // start watching again after this change even if error 
     try! contacts.executeSaveRequest(request) 
    } 
} 
Các vấn đề liên quan