核心数据获取请求的问题

问题描述:

我对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

我没有收到任何错误到控制台。每次更改数据时我都会保存上下文。 –

打电话我从容器中得到了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() 
     } 
    } 
} 

我希望它有帮助。

如果你没有得到任何错误。也许这是因为改变后你没有保存上下文

你确定你做到了吗?

此方法可帮助您节省方面改变

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'时,我会变得真实 –