2014-10-07 58 views
0

我有以下類別:NSManagedObject被自動設置爲故障

class Profile { 
    var state:State 
    var member:Member? 
} 

class Member: NSManagedObject { 
    @NSManaged var nickName: String? 
    @NSManaged var mId: String? 
} 

問題位於下面的類:

class RegisterMultiTableVContr: UITableViewController { 

    var profile:Profile? 

    override func viewDidLoad() { 
     self.profileService.createEmptyProfile(
       { (profile:Profile) in 
        self.profile = profile 
        println("\(self.profile!.member!.description)") 
        /* 
        Correct: 
        Output: 
        <meetpoll.Member: 0x7fd654175c10> (entity: Member; id: 0xd000000000c80000<x-coredata://21228B23-63B3-4708-8EAC-3302072BA074/Member/p5> ; data: { 
         mId = nil; 
         nickName = nil; 
        }) 
        */ 
       }, failure: { (error:String) in 
        // Exception Handling 
      }) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     println("\(self.profile!.member!.description)") 
     /* 
     Set to fault automatically 
     Output: 
     <meetpoll.Member: 0x7fd654175c10> (entity: Member; id: 0xd000000000c80000<x-coredata://21228B23-63B3-4708-8EAC-3302072BA074/Member/p50> ; 
     data: <fault>) 
     */ 
    } 
} 

的prepareForSegue功能僅在viewDidLoad中後調用。我將println函數的輸出寫入了源代碼。 我的問題是,爲什麼對象成員自動設置爲故障?以及如何將成員錯誤再次設置爲false?

包括2014年10月8日

功能創建成員對象像這樣的空簡介:

var member = NSEntityDescription.insertNewObjectForEntityForName("Member", inManagedObjectContext: context) as Member 
var profile = Profile(member:member) 
var error: NSError? = nil 
if context.save(&error) { 
    return profile 
} 

包括2014年10月9日

好吧,我見你需要更多的信息,所以我寫了一個簡單的例子,並加載到GitHub https://github.com/qeychon/CoreDataBug/tree/master

+0

這真的是個問題嗎?錯誤只是表示信息不在內存中,但如果你需要的話,它會被提取......有些情況下,你應該關心它,如果你正在做一堆自定義排序或者其他的東西......但通常情況下,您應該使用默認的斷層行爲 – 2014-10-07 20:11:34

+0

故障是正常的,應該是預期的。 – quellish 2014-10-08 06:17:12

+0

謝謝你的回覆。問題是,如果我使用insertNewObjectForEntityForName創建一個對象並保存,那麼我可以在其後不久更改這些屬性。在這個例子中,我發現同一個對象有時會被設置爲錯誤。什麼導致了這種變化? – Qeychon 2014-10-08 08:21:56

回答

0

之所以檢索與持久值完整的對象,爲什麼第一個對象可以是已更改:核心數據功能是異步執行的。因此,該對象可以暫時改變。在一段時間之後調用save方法(謝謝@quellish),並突然將對象設置爲只讀(錯誤)。解決方案:保存方法必須稍後調用!

0

我不知道爲什麼它會自動設置爲故障,它似乎是別的東西在被調用。您可以輕鬆地把你的對象變成故障或完整的對象與

  • [的NSManagedObjectContext refreshObject:○mergeChanges:YES/NO]

哪裏是去了一個對象,NO無二故障。

+0

核心數據默認返回錯誤。 – quellish 2014-10-08 06:15:18

+0

是的,但不是當你創建它們時。這裏的對象被創建,然後變成OS之間的兩個回調之間的故障 – Terminus 2014-10-08 20:57:46

+0

如果我將mergeChanges設置爲true或false,那麼它總是錯誤的。這真是奇怪 – Qeychon 2014-10-08 22:36:46

1

您可以設置

[request setReturnsObjectsAsFaults:NO] 

更新

對不起,我是從iPhone應用程序

回答作爲quellish說有什麼不對從CoreData進行讀取時獲得的故障延時。 每個對象將是「錯誤」,直到你需要訪問他們的持久值,你可以強制核心數據通過設置

[request setReturnsObjectsAsFaults:NO] 
+0

@GameDroids,我沒有看到這裏有什麼不明確的地方。 Adi Pop在提取請求中說,將'returnsObjectsAsFaults'設置爲NO。因此,核心數據不會將對象作爲提取中的錯誤返回。故障是默認行爲,應該*總是*預期。 – quellish 2014-10-08 06:16:45

+0

+1更新 – GameDroids 2014-10-08 08:29:00

+0

但是,我沒有實現FetchRequest,所以我無法設置故障狀態。我將這添加到了我的問題中。 – Qeychon 2014-10-08 12:00:22