2009-07-09 37 views
19

Có thể quan sát (đăng ký) các thay đổi đối với các giá trị được lưu trữ trong các khóa khác nhau trong NSMutableDictionary không? Trong trường hợp của tôi, các khóa đã tồn tại khi đăng ký được bắt đầu, nhưng các giá trị thay đổi và tôi muốn được thông báo trong trường hợp này. Tôi muốn khóa của giá trị thay đổi trong thông báo.Quan sát các thay đổi NSMutableDictionary

Tôi giả sử rằng nếu các khóa từ điển của tôi là tất cả các trường hợp NSString, tôi chỉ có thể đăng ký từng đường dẫn khóa riêng lẻ. Nhưng nếu chìa khóa của tôi không phải là dây thì sao? Tôi có may mắn trong trường hợp đó không?

Trả lời

6

Đó là một ý tưởng thú vị. Tôi không thể tìm thấy bất cứ điều gì trong NSDictionary hoặc NSDictionaryController trông đầy hứa hẹn. Bản năng đầu tiên của tôi là sử dụng bố cục xung quanh NSMutableDictionary và chặn cuộc gọi tới setObject: forKey: (và có thể -removeObjectForKey :) để thông báo cho người đăng ký thay đổi.

Có một số Cocoa With Love post về phân lớp NSMutableDictionary có thể hữu ích nếu bạn chọn đi tuyến đường đó. Tôi cũng có created my own NSMutableDictionary subclasses và bạn có thể sử dụng mã nguồn mở.

Bạn có thể thiết kế giao thức người quan sát có thể chỉ định các khóa cụ thể cần được theo dõi. Không nên quá nhiều mã, nhưng nhiều hơn tôi có thời gian để ném xuống vào lúc này.

+0

Cảm ơn. Tôi nghĩ rằng thành phần xung quanh một NSMutableDictionary là con đường để đi. Tôi vẫn không thể nhìn thấy làm thế nào để làm cho công việc đó, trừ khi các phím là NSStrings, nhưng tôi nghĩ rằng tôi có thể có thể làm việc với điều đó. –

+0

@Quinn Taylor: liên kết tới lớp con tùy chỉnh của bạn có vẻ đã chết và tôi cần phải kiểm tra mã này. Bạn vẫn có nó treo xung quanh một nơi nào đó? – Cyrille

6

Tôi đã triển khai thành công việc này ngay bây giờ, bằng cách sử dụng bố cục xung quanh NSMutableDictionary. Tôi rất ngạc nhiên khi thấy mã nhỏ như thế nào. Lớp tôi thực hiện là Board, được sử dụng để đại diện cho mô hình trong một trò chơi hội đồng quản trị. Bất cứ ai cũng có thể đăng ký thay đổi cho các quốc gia hội đồng quản trị bằng cách gọi addObserver: phương pháp, thực hiện như thế này:

- (void)addObserver:(id)observer { 
    for (id key in grid) 
     [self addObserver:observer 
       forKeyPath:[key description] 
        options:0 
        context:key]; 
} 

Vì bạn chỉ có thể đăng ký các phím sử dụng mô hình KVO, tôi đã lừa dối và đăng ký với mô tả của khóa , nhưng đi qua chính nó như là bối cảnh. Trong các đối tượng quan sát các phiên bản của Bảng của tôi, tôi triển khai -observeValueForKeyPath:ofObject:change:context: để bỏ qua chuỗi keyPath và chỉ sử dụng ngữ cảnh được truyền vào.

Lớp Ban đơn giản của tôi không tuân thủ KVO đối với thuộc tính nhân tạo mà tôi tạo bằng phương pháp này, vì vậy tôi đã thông qua 0 trong thuộc tính options để máy móc KVO không cố gắng lấy giá trị cũ/mới của các khóa đó. Điều đó sẽ làm cho mã của tôi nổ tung.

Bất cứ điều gì làm thay đổi hội đồng quản trị (trong lớp học đơn giản của tôi chỉ có một phương pháp mà thực hiện điều này) nâng cao thông báo cần thiết để làm cho máy móc KVO nhảy vào hành động:

- (void)setPiece:(id)piece atLocation:(Location*)loc { 
    [self willChangeValueForKey:[loc description]]; 
    [grid setObject:piece forKey:loc]; 
    [self didChangeValueForKey:[loc description]]; 
} 

Voila! Đăng ký một NSMutableDictionary với các phím không phải chuỗi!

+0

Đăng ký mô tả là một mẹo hay! –

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