2012-08-31 3 views
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 오류 노트입니다 위의 d. 나는 이것에 대해 갈 수있는 더 좋은 방법이 있는지 알고 싶다. 핵심 데이터 객체를 여기에 저장하는 것이 모범 사례가 아닙니다. 하지만 다른 뷰 컨트롤러에서 데이터를 가져올 때 데이터를 가져 오더라도 핵심 데이터 객체가 변경되면 어떻게 업데이트 할 수 있습니까? 나는 변경할 수있는 외부 plist를 가지고 있으며 핵심 데이터 객체는이를 기반으로 업데이트해야합니다.

답변

2

self.items = _itemssetItems: 메서드 안에 넣으면 무한 재귀가 발생합니다. self.items는 이고 정확하게이며 setItems를 호출하는 것과 같습니다. 동일한 메소드를 호출합니다. 대신에 인스턴스 변수가 무엇이든간에 - 아마도 items의 값을 설정해야합니다. 따라서 setItems:의 첫 번째 줄은 items = _items이어야합니다. 컨벤션은 변수가 인스턴스 변수를 나타 내기 전에 _ 있기 때문에 혼란 스럽습니다.

관련 문제