2015-02-26 38 views
5

Tôi đang gặp sự cố khi kết nối giữa ứng dụng máy chủ lưu trữ của tôi và tiện ích mở rộng của nó thông qua giao tiếp thay đổi NSUserDefaults.KVO với NSUserDefaults được chia sẻ trong Swift

tôi khởi NSUserDefaults sử dụng init(suiteName:), thêm KVO quan sát bằng cách sử dụng phương pháp addObserver(...) và overrided phương pháp observeValueForKeyPath(...) nhưng phương pháp observeValueForKeyPath(...) không được gọi khi tôi thay đổi giá trị tương ứng với quan sát key. Sẽ rất tuyệt nếu bạn giúp tôi giải quyết vấn đề này.

PS: tên bộ sách ở đây là tên Nhóm ứng dụng và NSUserDefaults được tạo bằng cách sử dụng suiteName as group identifier sẽ nằm trong khu vực riêng tư dành cho nhóm ứng dụng.

+0

http: // stackoverflow. com/questions/5714161/nsuserdefaults-and-kvo-issues –

+0

Xin chào @DanielGalasko. Nếu nó là một 'standardUserDefaults' KVO hoạt động tốt nhưng trong trường hợp của tôi thì nó được chia sẻ giữa các ứng dụng và mục' userdefaults' được tạo ra trong một vị trí riêng biệt. đã tạo một gói riêng cho nhóm và tạo tệp 'userdefault' ở đó và chia sẻ giữa các ứng dụng. Nó giống như liên lạc giữa các ứng dụng. – Rafeek

+0

Sau đó, bạn không thể sử dụng KVO nhưng cần phải sử dụng thông báo được đăng trên bộ :) –

Trả lời

1

Câu trả lời ngắn gọn là bạn không thể sử dụng KVO hoặc thậm chí NSNotificationCenter trên NSUserDefaults để giao tiếp các thay đổi giữa Tiện ích ứng dụng và Ứng dụng có chứa.

Có một số great post by Atomic Bird xem xét cách điều phối giao tiếp. Đặc biệt nó thú vị để nhìn vào phân tích của ông giao tiếp mặc định người sử dụng thay đổi:

Một lựa chọn tốt cho các thông báo ứng dụng/phần mở rộng là sử dụng trung tâm thông báo Darwin qua CFNotificationCenterGetDarwinNotifyCenter, mà thực sự là một chút hơi giống NSDistributedNotificationCenter . Có một số cuộc thảo luận của điều này bởi Wade Spiers tại trang web diễn đàn dev của Apple.

Tôi nói "có thể" bởi vì tôi không tự tin 100% về việc này tiếp tục hoạt động . Trong tài liệu hướng dẫn cho phương pháp này, Apple lưu ý rằng

Ứng dụng chỉ có một trung tâm thông báo Darwin, vì vậy chức năng này trả về cùng một giá trị mỗi khi được gọi. Vì vậy, mặc dù điều này rõ ràng là hợp pháp, nó cũng nghe rất giống như nó vi phạm triết lý vốn có trong hạn chế ứng dụng, viz, mà họ không thể truy cập bất kỳ thứ gì từ ứng dụng lưu trữ. Đây là lý do tại sao [UIApplication sharedApplication] bị tắt giới hạn trong tiện ích mở rộng. Tôi không thể giúp tự hỏi nếu cho phép CFNotificationCenterGetDarwinNotifyCenter là sự giám sát có thể bị "cố định" tại một thời điểm nào đó.

Vì vậy, tôi đoán bây giờ một giải pháp tốt có thể là sử dụng MMWormhole khi chúng triển khai giải pháp trên.

tùy chọn khác của bạn là sử dụng để kiểm tra giá trị mặc định người sử dụng mỗi khi ứng dụng của bạn trở nên linh hoạt và xác nhận xem bất kỳ phím đã thay đổi, đăng các thông báo liên quan, vv

Chúc may mắn

+0

Đây có phải là trường hợp, vào năm 2018 và với iOS 11 không? – SAHM

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