2010-07-24 50 views
1

我有一個簡單的XCode CoreData啓用的iPhone/iPad導航應用程序。在這裏,我修改了它最初定義的數據,以便在表格視圖中用關聯的圖像表示一些類別。例如通過修改事件類別的其他地方,改變.xcdatamodel文件,並在RootController.m改變這一呼籲:CoreData:從XML加載到初始數據集中

- (void)configureCell:(DeliciousCategoryCell *)cell atIndexPath:(NSIndexPath *)indexPath { 

    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    cell.categoryLabel.text = [[managedObject valueForKey:@"name"] description]; 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:cell.categoryLabel.text ofType:@"tiff"]; 
cell.categoryImage.image = [[UIImage alloc] initWithContentsOfFile:filePath]; 
} 

如果我通過把代碼預加載從XML文件中的數據:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

數據正常加載,但應用程序隨後隨EXC_BAD_ACCESS一起崩潰。如果我將這些代碼從應用程序加載出來,我的數據就會出現,並且我的類別可以與關聯的本地圖像一起顯示。我試着在別處移動有問題的代碼,如:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 

和檢查,以確保數據爲空但它仍然崩潰尚未加載數據。我似乎無法通過調試器追蹤EXC_BAD_ACCESS的原因,因爲堆棧跟蹤沒有有用的信息。我想知道的是對以下內容的回答,因爲我在蘋果文檔中找不到它:

1)當這種基於核心數據的應用程序首次啓動時,應該在初始數據集中加載的調用去哪兒?我會理想地通過網絡做到這一點,但我目前只是打開一個本地XML文件進行測試。

2)核心數據加載完成後,我想讓用戶通過合併來更新核心數據信息。這些代碼應該放在哪裏?

我沒有問題的邏輯只是必要的代碼afaict的位置。如果有人願意提供我在做什麼的清單,我會提供,但它相當冗長。所實現的代碼直接來自兩個蘋果教程。後者詳細說明如何在數據庫中不加載提取/選擇的情況下加載數據,但是所述教程沒有提及任何關於的地方,其中它應該駐留。

+0

您可以提供指向您複製的代碼的鏈接。這會讓閱讀更容易。 – TechZen 2010-07-24 13:12:25

+0

如果您還沒有,可以考慮查看TopSongs示例項目,該示例項目演示如何使用NSOperation的子類在另一個線程上導入xml。在他們的示例中,此導入器是在-applicationDidFinishLaunching中創建的: 儘管這並不完全符合您希望執行的操作,但您可以輕鬆修改它以僅啓動導入一次。 – 2010-07-24 13:12:31

+0

謝謝Darryl。我還沒有看到這個例子,儘管最近發現了一個讓我在一個應用程序中查看了tabview +導航視圖+模態對話的優秀視圖。我3周前需要的東西! http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreData/: 鏈接到有問題的代碼創建一個簡單的項目,滴答核心數據複選框+這裏找到兩個文章/cdImporting.html#// apple_ref/doc/uid/TP40003174-SW1 http://www.techotopia.com/index.php/Working_with_iPhone_Databases_using_Core_Data 和幾頁自定義單元格視圖。 – Diziet 2010-07-26 11:56:55

回答

0

當您看到EXC_BAD_ACCESS時,您已經過度釋放了一個對象。 Here is some troubleshooting advice

+0

感謝您的建議,我最終解決了這個問題,藉口個人鏈接,但我似乎無法找到我在官方的mac論壇上發佈的帖子: http://www.thelostsouls.org.uk/2010/ 07/how-to-populate-coredata-at-runtime-from-a-remote-source/ – Diziet 2010-07-26 11:44:59

2

我認爲你應該重視代碼的位置問題。 Objective-C,核心數據和一般的Apple API都是非常封裝和模塊化的。您幾乎可以在任何地方插入所需的功能並幾乎在任何時間激活它。唯一關鍵的地點/時間是與應用程序啓動和停止相關的應用程序委託方法。其他一切都很靈活。在你的情況下,你只需要在使用它之前加載數據,並且你只需要在數據發生變化之後合併數據。時間和地點的可能配置在功能上是無限的。不同的應用程序可以在不同的地點和時間完成這一切

你應該看看EXC_BAD_ACCESS更平淡的原因。在正常情況下,調試器會顯示出發生崩潰的行。如果它什麼也沒有顯示,那麼調試器本身很可能會崩潰。更有可能的是,你只是錯過了崩潰行的顯示,因爲觸發它的代碼中的行從堆棧跟蹤的屏幕滾動出來。 (很多初學者犯了這個錯誤。)

+0

關於調試器(我知道的可視化的gdb類型,gdb的一個顯示zip),它只顯示2這些代碼非常深入蘋果庫。 我覺得你絕對正確的關注我,而不是看看更普遍的錯誤,這要歸功於純語言的觀點。我必須承認,我仍然發現自己把控制器的功能放入控制器功能來檢查它們的加載順序。 :) 正如在下面的另一個評論中提到的,我解決了這個問題,儘管是一種駭人的方式。 – Diziet 2010-07-26 11:47:53