我的應用程序(目標iOS 6和更高版本)有一個儀表板視圖一個活動表視圖和一個活動詳細信息視圖(更多,但它們是無關緊要的爲這個主題)。Coredata獲取託管對象,而對象的其他實例正在編輯導致崩潰
一旦用戶進入儀表板,我將爲活動運行更新。在此期間,我會從核心數據中獲取活動列表,以便在需要時進行更新。 如果我在更新完成後打開表視圖,一切都很好。但是當我在更新期間打開它時,應用程序崩潰。 (在tableview中我加載核心數據(相同對象)的活動列表
錯誤是:終止應用程序,由於未捕獲的異常'NSInvalidArgumentException',原因:'左側的ALL或ANY操作者必須是一個NSArray或NSSet中「
嗯,我想這個錯誤是錯在它說什麼,因爲該語句工作正常,當我沒有更新
的fetchrequest:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Activity" inManagedObjectContext:managedObjectContext]];
[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"followedPlayer"]];
[fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"calendarDate" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"startTime" ascending:YES]]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ANY typeOfActivity IN %@", array]];
我個人認爲概率lem是我有一個Activity的兩個實例,而一個正在編輯,並且還沒有在managedobjectcontext上調用save(managedobjectcontext是一個單例)。然後,當保存被調用時(或者當第一個對象有未保存的更改時創建第二個對象),應用程序崩潰。
我認爲這個問題可以通過創建一個具有活動數組的單例類來解決,以便在任何時候只有一個活動對象實例(或者只是在更新時阻止對tableview的訪問)。但我想知道這是否可以以更好的方式完成。
我想到的方式是從核心數據獲取只讀/非託管對象。這可以通過直接訪問sqlite數據庫來完成。但在詳細視圖中,我必須獲得與活動有關係的其他對象,因此這不是我想象的方式。
有沒有人現在如果有可能(以及如何)獲得一個只讀託管對象或類似的東西,而無需直接訪問sqlite數據庫,或者我應該去一個包含活動的類,所以我沒有得到重複?
親切的問候
薩恩Inden的
這些必須在不同的線程上,對不對? – borrrden 2013-03-15 10:21:49
這是正確的,更新在後臺進行。 tableview的加載位於主線程中。 – 2013-03-15 11:17:43
然後,通過使託管對象成爲單例(不共享線程之間的上下文) – borrrden 2013-03-15 11:52:53