2

我嵌入'核心數據'到我的應用程序。我使用謂詞並獲取結果。我使用了一個名爲「fetchedObjects」的mutableArray來獲取(謂詞,然後提取)結果。現在我需要將這個結果傳遞給另一個視圖控制器。我怎樣才能做到這一點?如何將包括NSManagedObjects的NSMutableArray傳遞給另一個視圖控制器?

1.我嘗試的第一件事是使用'NSCoding',但它沒有解決。我認爲Core Data不符合NSCoding,對嗎?

如果我可以使用'NSCoding',我該怎麼做?我試圖保存,然後加載fetchedObjects,但它沒有成功。

2.Off當然,我可以定義使用

"product = [[Product alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];" 

一個指針,但我怎麼能得到公正的「fetchedObjects」 mutableArray但不是所有的對象?

3.你知道一個更好的方法來傳遞NSMutableArray中有NSManagedObjects嗎?以及我們如何才能將NSManagedObjects傳遞給其他視圖控制器,僅在上下文中?

謝謝!

回答

3

您可以使用NSNotification。

說視圖控制器A獲取結果,並且視圖控制器B需要它們。

在VCA

NSArray *data = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

[[NSNotificationCenter defaultCenter] 
postNotificationName:@"newFetchedDataNotification" 
       object:nil 
      userInfo:@{@"data": data}]; 

在VCB:

在viewWillAppear中

,開始監聽通知:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(processData) 
               name:@"newFetchedDataNotification" 
              object:nil]; 

,並添加了一個方法:

- (void)processData:(NSNotification *)notification 
{ 
    NSArray *data = [notification.userInfo objectForKey:@"succeeded"] 
} 

而且別忘了你nregister的通知在viewWillDisappear:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

我仍然認爲首選方法是使用一個NSFetchedResultsController做了第一次提取和通知時,改變對象。看看這個教程:

http://www.raywenderlich.com/999/core-data-tutorial-for-ios-how-to-use-nsfetchedresultscontroller

PS:NSManagedObjects就像任何其他對象,沒有必要使用的編碼。修改並保存它們時,您需要小心!

+0

謝謝!我檢查了NSFetchedResultsController,它似乎是最好的方法。我打算使用ObjectID和唯一的url,但現在我改變我的架構使用NSFetchedResultsController。這裏的問題是,我在VC中獲取對象,並且需要在另一個VC的tableview中顯示它們。我檢查了文檔,但找不到要做什麼。你能簡單介紹一下如何在VC中設置NSFetchedResultsController並在另一箇中使用NSFetchedResultsController嗎?謝謝 –

+0

NSFetchedResultsController的美妙之處在於您無需擔心數據更改。您可以在表視圖的數據源和委託中設置它,指定應該獲取哪些對象以及要在哪些MOC上進行監聽。對與抓取相關的對象進行的任何更改都會通知您的FetchedResultsController,它將自動執行抓取。所有這些在鏈接中的教程中都有很好的解釋! PS:如果答案有幫助,請不要忘記用左邊選票下面的綠色複選標記來接受它。 – raladdin

1

簡單的方式,

VC2.h

@property (strong) NSMutableArray *device; 

VC2.m

@synthesize device; 

現在你VC1從中你想通過數組

VC2 *v2=[VC2 alloc]initWithNibName:@"VC2" bundle:nil]; 
    v2.device = array; 
    [self.navigationController pushViewController:v2 animated:YES]; 

或者您沒有使用Navigationcontroller。

[self presentViewController:v2 animated:YES completion:nil]; 
3

而不是直接傳遞託管對象,如果它們都已經保存,我會通過ObjectID或唯一的URL,並讓接收器從商店中檢索它們。

檢索速度很快,也避免了許多併發性問題。

如果接收控制器只需要顯示數據,我還會考慮只用NSDictionary結果類型檢索所需的屬性,並將結果數組傳遞給控制器​​。但是,當然,我對你的設計一無所知。

UPDATE

如果我理解正確的評論,NSFRC的一大優勢是委託方法的一堆它所帶來。如果你讓你的UIViewController成爲你的NSFRC的代理,它是NSFetchedResultsControlerDelegate,那麼獲取的控制器本身將調用你的視圖控制器實現的委託方法,只要模型發生變化。然後在這個方法中你必須刷新你的表格視圖。 視圖不會自行刷新。

不同之處在於,如果您的UITableView數據源只是一個託管對象數組,您需要自行構建所有對模型更改作出反應的邏輯,識別哪些單元需要刷新,然後決定是否刪除/更新/移動等。如果你仔細想想,這是一個很好的實施邏輯,並且不會像NSFRC那樣有效,因爲NSFRC已經爲此定製了。另外,通過閱讀你的評論的其餘部分,你不能傳遞一個NSFetchedResultsController,我想你也可以,但它沒用,NSFRC是爲了在屏幕上的UIViewController中創建和使用的。 NSFRC實例化的參數很少,其中一個是NSFetchRequest,所以你必須定製你的請求來檢索你需要的對象。

P.S. 對不起,目前我在一家公司防火牆後面阻止了很多網站(包括蘋果文檔),因此我無法給你任何鏈接。

+0

謝謝萊昂納多!使用ObjectID和唯一的url是我的架構中的方法,但我決定使用NSFetchedResultsController,它似乎是一種更簡單的方式,所以我會改變我的架構。但我需要再問你一個問題,請幫助我;如果我使用ObjectID或唯一的url,我應該使用刷新控制器刷新我在tableview中顯示的數據,但是如果我使用NSFetchedResultsController,我不需要使用刷新控制器,因爲它將異步刷新?這是他們之間的區別?我無法通過Google找到我的問題的答案。謝謝! –

相關問題