2015-05-13 22 views
20

Tôi có một var khai báo trong một lớp học như vậy:Sử dụng quan sát tài sản trên NSManaged vars

@NSManaged var isFavorite: Bool 

Tôi muốn tuyên bố một người quan sát tài sản, rất giống với hình dưới đây.

var organization: String { 
     didSet { postNotificationWithName("newData") } 
    } 

Tuy nhiên, Swift cho tôi biết rằng người quan sát đặc tính trên NSMangaged không được phép. Có cách nào tôi có thể thực hiện một tính năng hoặc một cái gì đó tương tự cho biến của tôi isFavorite?

+0

Bạn có muốn đăng thông báo hoặc hỗ trợ các nhà quan sát khóa-giá trị hoặc cả hai? 'PostNotificationWithName()' đến từ đâu? –

Trả lời

19

Có - xóa @NSManaged. Nó không phải là hoàn toàn cần thiết, nhưng nếu bạn xóa nó, bạn không may cần phải thực hiện getset cho tài sản. Bạn cần phải thêm một số thông tin như

public var newData: String? 
    { 
    set { 
     self.willChangeValueForKey("newData") 
     self.setPrimitiveValue(newValue, forKey: "newData") 
     self.didChangeValueForKey("newData") 
    } 
    get { 
     self.willAccessValueForKey("newData") 
     let text = self.primitiveValueForKey("newData") as? String 
     self.didAccessValueForKey("newData") 
     return text 
    } 
} 

Thật khó chịu khi thực hiện cả hai điều này nếu bạn không thực sự cần chúng nhưng đó là cách thực hiện.

Vì bạn sẽ có set, bạn có thể không cần didSet, nhưng bạn vẫn có thể thêm didSet nếu bạn muốn.

+0

Lý do tôi đã khai báo biến là "NSManaged' là tôi yêu cầu biến đó được lưu trữ cục bộ bằng cách sử dụng Dữ liệu lõi (như một phần của kho lưu trữ dữ liệu cục bộ của Parse). Có cách nào để giải quyết điều đó không? – Satre

+1

Sử dụng '@ NSManaged' là không cần thiết khi sử dụng Dữ liệu cốt lõi nếu bạn thực hiện các trình truy cập giống như những người trong câu trả lời. Đoạn mã trên vẫn lưu dữ liệu vào kho lưu trữ liên tục. –

+0

Xcode cho tôi một lỗi rằng lớp 'Attendee' của tôi không có các thành viên có tên là' setPrimitiveValue' và 'didAccessValueForKey'. – Satre

2

Rất tiếc! Paul Patterson đúng. Những gì bạn cho là sử dụng là Quan sát giá trị khóa - đó chính xác là những gì nó nói bạn phải làm trong liên kết mà tôi đã đề xuất.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html

Xem ghi chú cũng nhanh chóng: https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html (sử dụng 'Ở Trang này' menu ở trên cùng bên phải của trang cho Key-Value Observing)

Vì vậy, một cái gì đó giống như

objectToObserve.addObserver(self, forKeyPath: "organization", options: .New, context: &myContext) 

được ghép nối với

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
+1

Điều đáng nói là tài liệu bạn tham chiếu rõ ràng cảnh báo bạn rằng bạn không nên ghi đè phương pháp này. –

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