2013-02-15 1 views
2

У меня нет четкого понимания того, как основные данные действительно работают. Возможно, это результат, с которым я столкнулся. У меня есть приложение, в котором я использую одно приложение managedObjectContext через приложение. Я знаю, что managedObjectContext поддерживает все управляемые объекты в нем, и до тех пор, пока я не сброшу контекст, объект всегда сохраняется самим контекстом. Итак, что я делаю, я получаю некоторый основной объект, такой как данные пользователя, а затем продолжаю передавать один и тот же объект во всем контроллере представления. Если происходят некоторые изменения, объект обновляется каким-либо другим кодом. Это работает практически во всех случаях.Основные данные и хранение над NSManagerObject

Но, я не держу сильный указатель на объект в любом viewcontrollers. Я просто поддерживаю слабую ссылку на него, поскольку сам объект сохраняется пулом managedObjectContext. Но я несколько раз сталкиваюсь с этой стратегией, когда объект обновляется путем синхронизации с удаленным. Мой слабый указатель становится бесполезным. В нем нет данных. Все атрибуты становятся пустыми. Хотя он показывает все имена атрибутов при входе в систему, значения равны нулю. Как я могу убедиться, что мой объект всегда обновляется и синхронизируется с основным контекстом? Является ли этот способ плохой указатель на managedObject плохой идеей. Я бы сказал, что я не сохраняю его ни в каком viewcontroller. Все контроллеры представлений используют слабый указатель.

Мой код будет выглядеть следующим образом,

В контроллере представления корневой Принести данные,

-(void)tableView:(UITableView*)tv didSelectRowAtIndexPath:(NSIndexPath*)indexPath{ 
    User *user = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    FirstViewController *firstViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"firstViewController"]; 
    firstViewController.user = user; 
} 

FirstViewController:

@interface FirstViewController:UIViewController 
    @property(nonatomic, weak) User *user 
@end 

я сделать много вещей с объектом здесь и в то же время я могу обновить объект от rootViewController. Но, поскольку это тот же самый объект, он, похоже, обновляется большую часть времени.

Затем снова в первом виде контроллер;

-(void)tableView:(UITableView*)tv didSelectRowAtIndexPath:(NSIndexPath*)indexPath{ 
    User *user = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    SecondViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondViewController"]; 
} 

SecondViewController:

@interface SecondViewController:UIViewController 
    @property(nonatomic, weak) User *user 
@end 

Здесь снова, объект ссылается слабо. Я делаю много вещей с объектом или некоторыми другими контроллерами представлений, которые могут синхронизироваться с удаленного, но он продолжает обновляться. Этот объект передается в глубокую иерархию до последнего контроллера представления, и все эти контроллеры представлений сохраняют слабые указатели на него.

В большинстве случаев это нормально. Но, много раз в моем текущем контроллере представления, даже если объект синхронизирован с сетью, он кажется нулевым, я имею в виду, что объект все еще существует со всеми описаниями свойств, но в нем нет значений. Но потом появляется через некоторое время.

Что могло случиться. Как сохранить объект, синхронизированный с корневым контекстом, и обновить, когда произойдут какие-либо изменения? Сохраняя сильный указатель, это сможет решить все мои проблемы. Наверное, это может быть из-за того, что объект не ошибается. Как я могу только обмануть объект в одном из объектов, чтобы он стал видимым для всех других объектов.

На самом деле было бы полезно ваше содействие и внимание. У меня может быть плохой английский, но если кто-то понимает мой вопрос и может выразить его лучше, я действительно был бы рад за это.:)

ответ

1

Если вам нужен объект, чтобы выжить при обновлении, не удерживайте его слабо, держите его сильно. Затем вы можете вызвать refreshObject: после обновления контекста. В качестве альтернативы используйте ленивый выбор в вашем аксессуре, чтобы при доступе к вашему объекту и нуле, мы снова делаем выборку.

Смотрите также:

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/Articles/cdTroubleshooting.html

Смежные вопросы