0
我的應用程序有一個Trip
實體,它與Spot
實體有多對多關係,我需要在後臺線程中加載trip和它的點列表。它在調試版本中工作正常,但在發行版中,現貨清單是空的!所以我挖了一點,發現它不能在發佈版本中工作,除非我將編譯器優化級別設置爲-O0
。我認爲這可能是編譯器的一個錯誤。加載CoreData在發佈版本中失敗
是否有任何建議使其適用於更高的優化級別,或者我必須發佈未優化的應用程序?謝謝!
下面是代碼:
主線程
[self performSelectorInBackground:@selector(calcRoute:) withObject:self.trip.objectID];
後臺線程
- (void)calcRoute:(NSManagedObjectID *)tripId
{
//get trip entity
CoreDataHelper * helper = nil; //responsible for init model, persistentStore and context
TripEntity * t = nil;
helper = [[CoreDataHelper alloc] initWithAnother:mainThreadHelper]; //only take the resource name and storeURL
t = (TripEntity *)[helper.context objectWithID:tripId]; //retrieve trip
if (0 == t.spotList.count) {
[self performSelectorOnMainThread:@selector(drawRouteFailed) withObject:nil waitUntilDone:FALSE];
return; //I got here!
}
//...
}
聽起來像你的多線程代碼是不正確的。它可能只是因爲計時而在調試版本中工作。你怎麼做你的多線程? (顯示代碼會有所幫助) – sosborn
那麼,我將trip objectID傳遞給後臺線程,並在該線程中重新創建CoreData模型,上下文和persistantStore,然後通過objectID檢索出行實體。由於我只讀取CoreData,因此不存在同步問題。 – DoZerg
「由於我只讀CoreData,所以沒有同步問題。」這不一定是真的。是的,它不會崩潰,但這並不意味着數據會同步。您應該查看父/子上下文並閱讀[Core Data的併發指南](http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html)。很難知道這是否是問題,但似乎很可能。 – sosborn