2011-06-19 40 views
7

Trong một lớp đơn giản, tôi có một thuộc tính NSMutableSet. Bất cứ khi nào các đối tượng được thêm vào hoặc bị xóa khỏi tập hợp, tôi muốn thực hiện một số mã tùy chỉnh. Tôi biết tôi có thể viết một vài phương pháp giống như lớp học addObjectToSet:, nhưng tôi đã tự hỏi nếu có một giải pháp thanh lịch hơn với KVO trực tiếp trên bộ này.Key-Value Quan sát một NSMutableSet

Khi nó quay ra, NSSet sẽ tăng ngoại lệ khi bạn cố thêm người quan sát vào nó. Không ngạc nhiên, vì có lẽ không có keyPath được đặt tên để quan sát. The documentation khá rõ ràng về ngoại lệ, nhưng tôi không hiểu giải pháp được đề xuất:

Thay vì quan sát một tập hợp, hãy quan sát mối quan hệ nhiều thứ tự không sắp xếp mà tập hợp là tập hợp các đối tượng liên quan.

Ai đó có thể nhắc lại điều này có nghĩa là gì? Và cách giải quyết như thế nào?

+1

Có một số cuộc thảo luận liên quan có thể được tìm thấy trong liên kết sau http://stackoverflow.com/questions/1610422/kvo-on-an-nscountedset –

Trả lời

6

Đó là một cách khá dày đặc để nói "không thêm một người quan sát để tập riêng của mình, thêm một người quan sát để lớp chứa tập":

[myObjWithASetAsIvar addObserver:self 
         forKeyPath:@"nameOfIvarHoldingTheSet" 
         options:NSKeyValueObservingOptionNew 
         context:nil]; 

Một chút khéo léo là bạn cần để bọc tất cả các truy cập của bạn vào tập hợp để gửi thông báo thích hợp. Trong lớp có chứa các thiết lập:

[self willChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 
// Do something with the set 
[self didChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 

Ngoài ra còn có hai phương pháp thông báo đặc biệt cho các bộ: willChangeValueForKey:withSetMutation:usingObjects:didChangeValueForKey:withSetMutation:usingObjects:; bạn có thể thấy rằng chúng hoạt động tốt hơn cho bạn so với các phương pháp "thay đổi giá trị" chung chung.

Tất cả những gì đã nói, tôi tin rằng giải pháp bạn đã đề cập trong đoạn đầu tiên và outlined by Peter Hosey trong câu hỏi Girish được liên kết đến, có lẽ là cách tốt nhất để đi.

+0

Tuyệt vời, cuối cùng tôi đã hiểu :) Tôi đã đi và viết truy cập của riêng tôi vào danh sách, như được đề xuất, và biết thêm một chút về KVO. Cảm ơn Josh & Girish! – epologee

1

Từ tài liệu của Apple trên NSSet (và, bằng cách suy luận và ý nghĩa, NSMutableSet):

đối tượng NSSet không thể quan sát được, vì vậy phương pháp này đặt ra một ngoại lệ khi gọi vào một đối tượng NSSet. Thay vì quan sát một tập hợp, quan sát mối quan hệ không liên quan đến nhiều bộ mà tập hợp là bộ sưu tập của các đối tượng liên quan.

Tôi rất vui vì bạn đã tìm thấy câu trả lời, nhưng thực tế là cách tiếp cận ban đầu của bạn không hoàn thiện (trong đó bạn cho rằng bạn có thể sử dụng addObserver trên NSSet), điều này cần được đề cập.

0

Nó thực sự khá rõ ràng khi bạn gắn nó với một ví dụ:

Nếu bạn có một Ngân hàng lớp mà có một NSSet của tài khoản, không thêm người quan sát trên Bank.accounts, thêm người quan sát trên tài khoản. ngân hàng

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