2014-09-08 9 views
8

के लिए कस्टम सेटर स्विफ्ट में NSManagedObject के लिए कस्टम सेटर को कैसे कार्यान्वित करें। मुझे NSMangedObject संपत्ति सेट करने से पहले कार्य करने की आवश्यकता है।स्विफ्ट: कोरडाटा NSManagedObject

उत्तर

7

मेरी सिफारिश केवीसी का उपयोग करना होगा। शायद सबसे सुरुचिपूर्ण समाधान नहीं, लेकिन संकल्पनात्मक रूप से केवीसी का तार्किक अनुप्रयोग है।

विशेषता का परिवर्तन देखें। init(entity:insertIntoManagedObjectContext:) में परिवर्तन के लिए पंजीकरण करें या awakeFromFetch और awakeFromInsert में बेहतर हो सकता है, और willTurnIntoFault में पर्यवेक्षक को हटा दें।

init(entity: NSEntityDescription!, insertIntoManagedObjectContext context: NSManagedObjectContext!) { 
    super.init(entity: entity, insertIntoManagedObjectContext: context) 
    addObserver(self, forKeyPath: "attribute", options: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old, context: nil) 
} 


override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: NSDictionary!, context: CMutableVoidPointer) { 
    if (keyPath == "attribute") { 
      // do what you need to do 
    } 

} 

स्विफ्ट 3 के लिए अपडेट किया गया:

init(entity: NSEntityDescription!, insertIntoManagedObjectContext context: NSManagedObjectContext!) { 
    super.init(entity: entity, insertIntoManagedObjectContext: context) 
    addObserver(self, forKeyPath: "attribute", options: [.old, .new], context: nil) 
} 

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if keyPath == "attribute" { 
      // do what you need to do 
    } 
} 
+0

विशेष रूप से यह मेरी समस्या 'विकल्पों हल: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old'। धन्यवाद। – Hokage

+0

मुझे लगता है कि एनएसएमएनेज ऑब्जेक्ट गलती में बदल जाता है तो केवीओ दृष्टिकोण अलग हो जाएगा। – Andy

6

भी एक सरल तरीका कैसे KVO सदस्यता को प्रबंधित किए बिना यह करने के लिए नहीं है। यह बस didChangeValueForKey: इस तरह अधिभावी द्वारा किया जा सकता:

override func didChangeValueForKey(key: String) { 
    super.didChangeValueForKey(key) 

    if key == "propertyName" { 
     // do something now when propertyName changed 
    } 
} 
+2

मैंने इसका भी उपयोग किया, दुर्भाग्यवश जब आप प्रलेखन को देखते हैं तो आपको नोटिस होगा कि 'आपको इस विधि को ओवरराइड नहीं करना चाहिए।' चेतावनी। तो मुझे लगता है कि यह शायद कुछ अप्रत्याशित प्रभाव हो सकता है। –

+1

@erikAigner जो सच है। मैं काफी समय से इस दृष्टिकोण का उपयोग कर रहा हूं और मेरा मानना ​​है कि दस्तावेज़ीकरण में चेतावनी ज्यादातर प्रदर्शन चिंताओं के लिए है, क्योंकि पूरे केवीओ/केवीसी इस विधि पर रिले कर रहे हैं (साथ ही 'willChangeValueForKey:') के साथ। केवीओ का सुझाव देने वाले स्वीकृत उत्तर में एक ही प्रदर्शन विशेषताएं हैं। अब तक मुझे इस दृष्टिकोण का उपयोग करने के एक अप्रत्याशित साइड इफेक्ट्स मिलते हैं। –

संबंधित मुद्दे