2016-07-23 30 views
6

我的應用程序連接到一個web服務,使用3種不同的方法執行POST,並將這3組數據中的每一個插入到Core Data中。每當新數據可用時,核心數據中的所有內容都將被刪除並插入新數據。這三種方法中的每一種都顯示在不同的TableViewControllers中,這意味着每次顯示這些TableViewControllers中的每一個時,都會有3個以上的提取。正確的線程執行刪除,插入和從核心數據中提取

包裝起來,我們有3組數據從Web服務中獲取,然後我將所有這些插入到不同的實體中,同時獲取新的數據以顯示在主要的TableViewController中。

現在我正在努力處理線程和多上下文核心數據結構的複雜關係。我應該在哪裏執行插入,刪除和獲取以確保我的應用程序的線程安全?

+0

你有多少數據?你目前有什麼上下文和線程? – Wain

+0

@有限數據相對較小。每個實體大約有一千條記錄。 NSURLSession與主線程上的完成處理程序一起工作。然後它調用一個方法來刪除(這是在主線程NSMainQueueConcurrencyType上完成的)並插入(主線程/ NSPrivateQueueConcurrencyType)。然後在主線程和主要上下文中進行獲取。 – user3687

回答

1

在多上下文CoreData中,可以有一個privateQueueRootMOC和一個mainQueueRootMoc,主MOC用於在mainThread中獲取數據,私有MOC用於在privateMOC線程中更新,插入和刪除數據。

privateMOC.performBlock({() -> Void in 
    //try insert, delete, update 
    .... 
    try privateMOC.save() 
    onCompleteBlock() //fetch data in main thread use main MOC 
}) 
+0

好吧,現在我把插入和刪除到私人MOC的執行塊,它似乎工作正常。但有一個問題,當我刷新一切(連接到web服務,刪除並插入到核心數據),然後我執行一個抓取它返回nil幾秒鐘。看起來好像在插入新數據之前在主要上下文中保存了刪除。 – user3687

+0

在主MOC中,您應該在privateMOC.save()之後添加一個完整的回調塊,並從主線程使用主MOC讀取數據。或者你可以在主MOC中使用NSFetchResultController來觀察在CoreData中改變的數據。 – Hao

4

您的UI是否從主環境中獲取主線程。

爲了導入,請不要在主線程上運行會話回調,在任何後臺隊列上運行它。創建一個新的私有上下文並將main設置爲其父項。在會話回調中,使用塊接口導入並保存後臺上下文,然後保存它的父項(再次使用塊接口)。

+0

我們曾嘗試在後臺線程上調度會話回調,並在MainThread上繼續插入,但我們遇到了與MainContext上的SaveContext相關的幾個問題。 「使用塊接口導入」是什麼意思?我不太瞭解你。 – user3687

+0

'NSManagedObjectContext'提供了一個塊接口,供您提交代碼以便以安全的方式執行 – Wain

+0

這導致主線程被阻塞,並且在將數據插入到核心數據時UI不響應。我認爲刪除和插入應該在另一個線程上執行。但是,當我這樣做時,我獲取的數據有時是錯誤的,而且它的獲取沒有完全執行。 – user3687