2012-10-27 73 views
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! 
    } 
//... 
} 
+0

聽起來像你的多線程代碼是不正確的。它可能只是因爲計時而在調試版本中工作。你怎麼做你的多線程? (顯示代碼會有所幫助) – sosborn

+0

那麼,我將trip objectID傳遞給後臺線程,並在該線程中重新創建CoreData模型,上下文和persistantStore,然後通過objectID檢索出行實體。由於我只讀取CoreData,因此不存在同步問題。 – DoZerg

+0

「由於我只讀CoreData,所以沒有同步問題。」這不一定是真的。是的,它不會崩潰,但這並不意味着數據會同步。您應該查看父/子上下文並閱讀[Core Data的併發指南](http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html)。很難知道這是否是問題,但似乎很可能。 – sosborn

回答

0

我終於解決了這個問題。原因是:我'使用'的主線旅行實體。下面是實際的代碼:

- (void)calcRoute:(NSManagedObjectID *)tripId 
{ 
    //get trip entity 
    CoreDataHelper * helper = nil; //responsible for init model, persistentStore and context 
    TripEntity * t = nil; 
    if (self.backgroundDrow) { //sometimes I don't need background drawing 
     helper = [[CoreDataHelper alloc] initWithAnother:mainThreadHelper]; //only take the resource name and storeURL 
     t = (TripEntity *)[helper.context objectWithID:tripId]; //retrieve trip 
    } else 
     t = self.mainThreadTrip;   //HERE is the problem!!! 
    if (0 == t.spotList.count) { 
     [self performSelectorOnMainThread:@selector(drawRouteFailed) withObject:nil waitUntilDone:FALSE]; 
     return; //I got here! 
    } 
    //... 
} 

我評論t = self.mainThreadTrip;後,後臺加載變得OK!

但我還是沒有明白!有人會告訴我真實的原因嗎?非常感謝!