2013-01-12 71 views
7

我的iOS應用程序通過多個線程使用核心數據。我收到了一些崩潰報告,其中包含以下消息:''NSObjectInaccessibleException',原因:'CoreData無法爲'0x1e07a9b0'執行錯誤'NSObjectInaccessibleException',原因:'CoreData無法履行故障

我明白是什麼導致此問題 - 該對象已被刪除,但另一個線程我正在努力解決這個問題,但我想在後臺線程中添加一個檢查,以查看對象是否會以這種方式發生故障。

我的代碼目前與myObject.myValue有關。可能做一些檢查,如:

if (!myObject.myValue) { 
    return; 
} 

......這樣它就會從t他在做任何可能導致這樣的崩潰的方法之前的方法?或者只是簡單地調用myObject.myValue,甚至查看它是否爲空,導致這樣的異常被拋出?

+8

順便說一句,你有一個非常低的答案接受這可能是爲什麼沒有人想回答你的問題。請考慮查看您的舊問題併爲每個問題選擇正確的答案。 http://stackoverflow.com/users/353137/jason?tab=questions – iwasrobbed

回答

19

你可以嘗試使用existingObjectWithID:error:

返回指定ID的對象。

- (NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)error 

討論

是否有與在上下文已經註冊給定的ID的管理對象,該對象是直接返回;否則相應的對象將出現在上下文中。

如果數據未被高速緩存,則此方法可能會執行I/O。

與objectWithID不同,該方法從不返回錯誤。

你可以這樣做:

if ([myMOC existingObjectWithID:myObject.objectID error:&error]) 
    ... 
5

您應該驗證對象訪問,如果你有其中對象可以在另一個線程上被刪除的問題是變量之前存在。

兩種方法:

  1. 刷新每當你的數據被刪除視圖的數據源。您可以通過註冊NSManagedObjectContextObjectsDidChangeNotification通知然後解析該通知上的userInfo來查看哪個對象已被刪除。
  2. 當您將數據傳遞給多個線程時,使用類似於下面的代碼。

例子:

// Cache and pass the object's ID off to another thread to do work on 
// You can just store it as a property on the class 
@try { 
    NSManagedObject *theObject = [managedObjectContext objectWithID:self.theObjectID]; 

    // do stuff with object 
} 
@catch (NSException * e) { 
    // An entity with that object ID could not be found (maybe they were deleted) 
    NSLog(@"Error finding object: %@: %@", [e name], [e reason]); 
} 
+0

方法#1,肯定。我可以等待我的「詳細信息」視圖上的通知(可在同步之前/期間訪問),並禁用與該對象交互的任何功能,通知用戶等。 – Mark

0

您可以檢查[myObject isFault]其中myObjectNSManagedObject實例

+0

對象單獨出現故障並不意味着訪問它的任何屬性都會拋出這個異常。通常,這隻會導致數據從數據存儲中加載。如果該對象不再存在於數據存儲器中並且因此不能被加載(也稱爲「故障」),則僅拋出異常。 –

2

您可以查看當您使用NSManagedObject的NSManagedContext是存在的。 是這樣的:

if (obj.managedObjectContext) 
{ 
    //do things 
} 
+0

我有同樣的想法,但是我找不到任何確認此行爲的文檔。任何人都可以證實,這是一個確定的方法來檢查對象是否仍然可用? –