2013-06-09 53 views
14

Tôi đã đọc nhiều tài liệu trên KVO, nhưng tôi vẫn còn bối rối khi sử dụng nó.khi nào sử dụng KVO?

Trong trường hợp objA muốn giám sát một tài sản nhất định objB, như vậy:

self.objB = [[ObjB alloc] init]; 
[self.objB addObserver:self 
      forKeyPath:@"address" 
       options:0 
       context:nil]; 

vì vậy nếu thay đổi sở hữu objB 's, và nó chỉ có thể được thay đổi bằng cách self, tại sao không chỉ làm điều này:

self.objB.property = @"newValue"; 
[self doSomethingBasedOnNewValueOfObjBnewProperty]; 

thay vì

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 

{ 
    if(keyPath == @"address") { 
     [self doSomethingBasedOnNewValueOfObjBnewProperty]; 
    } 
} 

Nó có thể hữu ích khi được sử dụng với một singleton, như self.objB = [ObjB sharedInstance], nơi các thuộc tính có thể được thay đổi bởi các đối tượng khác. Đây có phải là trường hợp sử dụng duy nhất không?

Trả lời

16

Không phải tất cả các phiên bản của tất cả các lớp đều được tạo và chỉnh sửa chỉ bởi cùng một trường hợp (ví dụ như ví dụ của bạn).

KVO là một phương pháp chung mà theo đó một thể hiện có thể quan sát các thay đổi trên một phiên bản khác và nhận thông báo về những gì đã xảy ra. Những thay đổi đó có thể được kích hoạt từ bất cứ đâu.

Giả sử bạn đã thêm thư viện của bên thứ ba vào dự án của mình. Bạn không biết nó được triển khai như thế nào. Gọi một phương thức có thể thay đổi nhiều thuộc tính khác nhau trong cá thể lớp thư viện. KVO cung cấp một cách dễ dàng để bạn theo dõi và phản ứng với những thay đổi đó.

KVO cũng cung cấp 'Khóa phụ thuộc' cho phép bạn định cấu hình mối quan hệ giữa các khóa để bạn có thể nói "giá trị của thuộc tính này phụ thuộc vào một hoặc nhiều thuộc tính khác trong đối tượng khác" và KVO sẽ cho bạn biết khi nào điều đó xảy ra . Điều này có thể đặc biệt hữu ích trong lớp con đối tượng được quản lý, nếu bạn có khóa tạm thời chứa giá trị được lưu trong bộ nhớ cache cho một số khóa liên tục và bộ nhớ cache cần được cập nhật bất cứ khi nào giá trị dai dẳng thay đổi ...

11

Câu trả lời của Wain là hoàn hảo . Tôi muốn đóng góp bằng cách nêu một số ví dụ về việc sử dụng có thể có của KVO.

KVO có thể hữu ích trong trường hợp một số đối tượng "nói một hoặc nhiều bộ điều khiển chế độ xem" cần giám sát các thay đổi trong nhiều đối tượng.

Ví dụ, một trò chơi FPS có một số quan điểm, một cho thấy sự tương tác người chơi với nhau khác, một cái nhìn về một góc mà cho thấy các cầu thủ hiện tại điểm và sức khỏe; và một menu mà hiển thị điểm số của người chơi khi nút được nhấn hoặc trò chơi bị tạm dừng. Nếu người chơi hiện tại chạm hoặc bị người chơi khác đánh, bạn cần phải cập nhật chế độ xem chính, bằng cách hiển thị thành công hoặc hiển thị một số dấu hiệu cho thấy người chơi bị chấn thương, điểm số và tình trạng sức khỏe cần cập nhật dữ liệu và cần phải cập nhật điểm số của người chơi. Bây giờ giả sử bạn cần thêm một bộ điều khiển mới để theo dõi thành tích của người chơi bằng cách theo dõi điểm số của anh ấy và số lượng sát thủ của anh ấy. Đối tượng này cũng cần được thông báo về bất kỳ sự kiện nào xảy ra với người chơi.

Trong trường hợp đó, nhiều đối tượng cần giám sát các thay đổi của nhiều đối tượng khác "trình phát hiện tại và các trình phát khác".KVO cung cấp cho bạn một công cụ đơn giản để đạt được điều này mà không cần phải viết mã để xử lý đăng ký thông báo và các thông báo thực tế. Hãy suy nghĩ làm thế nào nó sẽ đưa bạn thực hiện nó từ đầu để thông báo sự khác biệt.


Trong một ví dụ khác, tôi thường có xu hướng làm cho một bộ nạp singelton cho một số dữ liệu lấy ra bởi một dịch vụ web. Trong trường hợp này, một số dữ liệu là cần thiết bởi nhiều phần của ứng dụng.

Ví dụ: bạn muốn phát triển một ứng dụng được thực hiện bởi một cửa hàng hiển thị cho người dùng các mục khả dụng. Ứng dụng này cần phải thể hiện người dùng một cái nhìn bảng hiển thị tất cả các mục, một cái nhìn để hiển thị mục thuộc một thể loại cụ thể, khác nhằm mục hiển thị trên bán, xem khác để hiển thị các chi tiết và số lượng có sẵn của một mục nhất định. Giả sử ứng dụng được yêu cầu để làm mới dữ liệu sau vài giờ hoặc khi người dùng yêu cầu làm mới. Lớp trình nạp đó có thể xử lý hành động làm mới của chính nó và các bộ điều khiển xem có thể đăng ký các khóa liên quan. Bằng cách này, làm mới được xử lý trong một đối tượng và các đối tượng khác chỉ có thể tập trung vào logic xử lý chế độ xem của họ.

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