0

plistに一連のアイテムがあります。アプリが起動したら、plistを読み込み、次のようにDataManagerシングルトンに配列として保存します。

NSString *path = [[NSBundle mainBundle] bundlePath];

NSString *itemDatapath = [path stringByAppendingPathComponent:@"ItemData.plist"];
NSDictionary *itemData = [NSDictionary dictionaryWithContentsOfFile:itemDatapath];
dataManager.items = [itemData objectForKey:@"Items"];

また、このデータに関連付けられているコアデータオブジェクトをDataMangerに保存したいので、これを試みました。

-(void)setItems:(NSArray *)_items //causes EXC_BAD_ACCESS error
{
self.items = _items;

NSManagedObjectContext *context = [self managedObjectContext];


for (NSDictionary *item in self.items)
{
    NSManagedObject *itemObject = [NSEntityDescription
                                   insertNewObjectForEntityForName:@"Item"
                                   inManagedObjectContext:context];
    [itemObject setValue:[NSNumber numberWithInteger:[[item valueForKey:@"id"] intValue]] forKey:@"identifier"];
    [itemObject setValue:[UIImage imageNamed:[item valueForKey:@"image"]] forKey:@"image"];
    ...

}


NSError *error;
if (![context save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
}

重要なのは、アプリのどこからでもこのメソッドからオブジェクトにアクセスできるということです。

-(NSArray*)fetchItems
{
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Item" inManagedObjectContext:managedObjectContext];



NSError *error2;
NSFetchRequest *itemFetchRequest = [[NSFetchRequest alloc] init];
[itemFetchRequest setEntity:entity];


NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order"
                                                               ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[itemFetchRequest setSortDescriptors:sortDescriptors];

NSArray *fetchedItems = [managedObjectContext executeFetchRequest:itemFetchRequest error:&error2];


return fetchedItems;


}

問題は、上記のEXC_BAD_ACCESSエラーです。これについてもっと良い方法があるかどうかも知りたいです。ここにコアデータオブジェクトを保存することはベストプラクティスではないと感じています。しかし、他のView Controllerで必要なときにデータをフェッチした場合でも、コアデータオブジェクトが変更された場合に更新を管理するにはどうすればよいですか?変更される可能性のある外部plistがあり、それに基づいてコアデータオブジェクトを更新する必要があります。

4

1 に答える 1

2

self.items = _itemsメソッド内に入れると、無限再帰が発生しますsetItems:。self.itemsは、setItemsを呼び出すのとまったく同じです。つまり、同じメソッドを呼び出します。代わりに行う必要があるのは、インスタンス変数が何であれ、おそらくの値を設定することですitems。したがって、の最初の行はであるsetItems:必要がありますitems = _items。変数がインスタンス変数を示す前に_を付けるのが慣例であるため、それ自体も混乱を招きます。

于 2012-08-31T00:38:24.053 に答える