2013-02-15 90 views
2

我沒有清楚地瞭解核心數據的工作原理。可能是這是我所面臨的結果。我有一個應用程序,其中我通過應用程序使用單個managedObjectContext。我知道managedObjectContext包含其中的所有managedObjects,直到我重置上下文爲止,該對象始終由上下文本身保留。所以,我所做的是獲取一些像用戶數據這樣的主要對象,然後繼續在整個視圖控制器中傳遞相同的對象。如果發生某些更改,則該對象將被其他代碼刷新。這在幾乎所有情況下都能很好地工作。核心數據和持有NSManagerObject

但是,我不保留任何視圖控制器中的對象的強指針。我只是保留了一個弱引用,因爲對象本身是由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 

在這裏,對象是弱引用。我用這個對象做了很多事情,或者其他一些視圖控制器可以從遠程同步,但是它不斷更新。這個對象被傳遞到深層次直到最後一個視圖控制器,並且所有這些視圖控制器保持弱指針。

大部分時間都很好。但是,即使對象被同步到網絡中,在我當前的視圖控制器中很多時候,它看起來都是空的,我的意思是對象仍然存在於所有屬性描述中,但沒有值。但是,一段時間後突然出現。

可能發生了什麼。如何保持對象同步到根上下文並在發生任何更改時進行刷新?保持一個強大的指針,這將能夠解決我所有的問題。我想這可能是因爲對象沒有被錯誤。我怎樣才能排除某個對象中的某個對象,使其對所有其他對象都可見。

真的很感謝您的幫助和關心。我可能有一個不好的英語,但如果有人瞭解我的問題,並可以更好地表達,我也會很高興。:)

回答