2017-09-03 105 views
1

我對iOS開發人員來說很新,而且我在覈心數據獲取請求方面遇到了一些問題。我正在使用Xcode 9-beta和swift 4.我每次更新數據庫時,都會用一個提取請求加載新數據,進行一些計算並填充表視圖。核心數據獲取請求的問題

我的挑戰是每次我爲一個實體執行一個獲取請求時,即使它發生了變化,我也會得到相同的數據。在我看來,重複使用來自先前獲取請求的數據,因爲如果我關閉應用並再次打開它,它會向我顯示新存儲的數據。

這裏是我的代碼:

if let context = container?.viewContext { 
     context.perform { 

      let request: NSFetchRequest<EntityName> = EntityName.fetchRequest() 
      let data = try? context.fetch(request) 
      self.data = data! 

      self.setUI() 
     } 
} 

我得到的容器中:

let container: NSPersistentContainer? = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer 

我給一些通用的名字,因爲我認爲這是無關緊要的問題。

有什麼想法?

感謝, JL

+0

您是否收到任何錯誤或輸出到控制檯? – Scriptable

+0

訪存請求永遠不會被重用。也許你在更改數據後忘記了保存上下文。 Btw:持久化容器和託管對象上下文應該是非可選的,AppDelegate是強制的,否則應用程序將不會啓動。強迫解開對象並不是邪惡的:'let container =(UIApplication.shared.delegate as!AppDelegate).persistentContainer' – vadian

+0

我沒有收到任何錯誤到控制檯。每次更改數據時我都會保存上下文。 –

回答

0

打電話我從容器中得到了viewContext,因爲我需要的UI線程。我想這是我的問題。我解決了它通過我用來獲取和創建數據並將請求發送到主隊列的上下文:

func loadData(with context: NSManagedObjectContext) { 

    context.perform { 

     DispatchQueue.main.async { 
      let request: NSFetchRequest<EntityName> = EntityName.fetchRequest() 
      let data = try? context.fetch(request) 
      self.data = data! 

      self.setUI() 
     } 
    } 
} 

我希望它有幫助。

0

如果你沒有得到任何錯誤。也許這是因爲改變後你沒有保存上下文

你確定你做到了嗎?

此方法可幫助您節省方面改變

private func saveContext() { 
    guard managedObjectContext.hasChanges else { 
     return 
    } 
    do { 
     try managedObjectContext.save() 
    } catch { 
     abort() 
    } 
    } 

試圖找到它之後AppDelegate

UPDATE:

它也可能是因爲.perform是異步,並且在更新數據,它還沒有保存。

異步執行上下文隊列中的塊。 封裝自動釋放池,並processPendingChanges

+0

我確實保存了上下文。此外,我知道它是有效的,因爲當我關閉應用程序並再次打開它時,它會顯示更新的數據,所以我會說它與獲取請求有關。是的,它在AppDelegate文件中。 –

+0

當你更新UI時,它是否是主線程?因爲context.perform是異步的。如果你改變smt並保存爲異步,也許數據仍然保存,或仍然加載。嘗試找到它並進行調試。 –

+0

這是主線程,因爲否則我會得到一個錯誤。另外,當使用'Thread.isMainThread'時,我會變得真實 –