2011-08-12 36 views

Trả lời

15

Thông báo và KVO phục vụ các chức năng tương tự, nhưng có các giao dịch khác nhau.

  • Thông báo dễ hiểu. KVO là ... thách thức ... để hiểu (ít nhất là để hiểu làm thế nào để sử dụng nó cũng).

  • Thông báo yêu cầu sửa đổi mã quan sát. Các quan sát phải rõ ràng tạo ra mọi thông báo nó cung cấp. KVO là minh bạch cho mã quan sát miễn là mã quan sát phù hợp với KVC (mà nó nên anyway).

  • Thông báo có phí ngay cả khi bạn không sử dụng chúng. Mỗi khi mã quan sát đăng thông báo, nó phải được kiểm tra đối với mọi quan sát trong hệ thống, ngay cả khi không có ai quan sát đối tượng đó (ngay cả khi không ai quan sát bất kỳ thứ gì). Điều này có thể rất nhỏ nếu có hơn một trăm quan sát trong hệ thống. Nó có thể là một vấn đề nghiêm trọng nếu có vài nghìn. KVO có tổng chi phí bằng không cho bất kỳ đối tượng nào không thực sự được quan sát.

Nói chung, tôi không khuyến khích KVO vì một số vấn đề triển khai cụ thể mà tôi cho là khó sử dụng đúng cách. Thật khó để quan sát một đối tượng mà lớp cha của bạn cũng quan sát mà không có kiến ​​thức đặc biệt về siêu lớp của bạn. Sự phụ thuộc nặng nề của các chuỗi ký tự làm cho các lỗi nhỏ khó đánh bắt tại thời gian biên dịch. Nói chung, tôi tìm thấy mã dựa nhiều vào nó trở nên phức tạp và khó đọc, và bắt đầu nhận các lỗi ma quái-hành động-tại-một-khoảng cách. Mã số NSNotification có xu hướng đơn giản hơn và bạn có thể thấy điều gì đang xảy ra. Mã ngẫu nhiên không chỉ chạy khi bạn không mong đợi nó.

Tất cả những gì đã nói, KVO là một tính năng quan trọng và các nhà phát triển cần phải hiểu nó. Ngày càng có nhiều đối tượng cấp thấp dựa vào nó vì nó có lợi thế bằng không. Nhưng đối với các nhà phát triển mới, tôi thường khuyên họ nên dựa nhiều vào thông báo hơn là KVO.

Có cách thứ ba. Bạn có thể giữ một danh sách người nghe và gửi tin nhắn cho họ khi mọi thứ thay đổi, giống như phương thức đại biểu. Một số người gọi những "đại biểu multicast" nhưng "thính giả" là chính xác hơn ở đây bởi vì họ không sửa đổi hành vi của đối tượng như một đại biểu nào. Làm theo cách này có thể nhanh hơn đáng kể so với NSNotification nếu bạn cần nhiều quan sát trong một hệ thống, mà không cần thêm sự phức tạp của KVO.

+0

Cảm ơn bạn, Rob! > Thông báo có phí ngay cả khi bạn không sử dụng chúng. Mỗi khi mã quan sát đăng thông báo, nó phải được kiểm tra đối với mọi quan sát trong hệ thống, ngay cả khi không có ai đang quan sát đối tượng đó (ngay cả khi không có ai quan sát bất kỳ thứ gì). Không thể giải quyết vấn đề này cho các NSNotificationCenter khác nhau? Không thể cải thiện hiệu suất này, tôi không chắc chắn –

+2

Có, quản lý NSNotificationCenters riêng biệt sẽ cải thiện hiệu suất tìm kiếm. Mô hình "người nghe" tôi mô tả về bản chất là sự tiến hóa cuối cùng của điều này, về cơ bản cho từng đối tượng riêng lẻ trung tâm thông báo của riêng nó (đó là một triển khai mà tôi đã chơi với ban đầu). Vấn đề chính với nhiều trung tâm thông báo là nó là một mô hình bất thường và có thể gây nhầm lẫn cho các nhà phát triển khác.Khi họ sử dụng sai trung tâm, nó chỉ lặng lẽ không làm gì, và họ không biết tại sao. Nhưng về nguyên tắc thì không có gì sai cả. –

+0

Làm theo liên kết này tốt hơn: http://nshipster.com/nsnotification-and-nsnotificationcenter/ –

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