j9九游会登陆--首页直达

利用Core Data时必要制止的三个常出错误
  • 智网科技
  • ###
  • 分类: 履历之谈
  • 阅读量: 104

thumb_67340421-speed-wallpapers.jpg

  • 原文:

  • 作者: 


熟习 Core Data 的开辟者并不以为这个框架用起来很难。假如你遵照这个框架的规矩,Core Data 不会让你感触狐疑。但通常这也是个题目,开辟者出错每每是由于违背了某条他们并不晓得的规矩。以是,这篇文章我将次要讨论开辟者在利用Core Data时常犯的三个错误。

1.在错误的线程拜访托管工具上下文(Managed Object Context)

Core Data从未被设计用来在多线程的情况中利用。侥幸的是,这个框架曾经在这些年渐渐开展,使得 Core Data 在多线程的使用步伐中利用并不难。

假如你熟习Core Data,那你应该理解Core Data利用 线程限定 来掩护托管工具上下文。这意味着你只应该经过与托管工具上下文所联系关系的线程来拜访它。但你怎样晓得与之联系关系的是哪一个线程呢?

在iOS 5和macOS 10.7中,一个托管工具上下文创立而且办理一个调理行列步队,并在这个行列步队上举行事情。`NSManagedObjectContext` 类提供了一个利便的接口来在托管工具上下文创立的调理行列步队中实行种种操纵。你有两个选择:

  • perform(_:)

  • performAndWait(_:)

每个办法都吸收一个闭包作为参数,可以在这个闭包中对托管工具上下文所办理的托管工具举行操纵。

 

1
2
3
4
5
6
7
managedObjectContext.perform {
    ...
}
 
managedObjectContext.performAndWait {
    ...
}

`perform(_:)` 和 `performAndWait(_:)` 的区别在于托管工具上下文的调理行列步队怎样来方案实行闭包中的操纵。

如名字所示

  • `perform(_:)` 办法在托管工具上下文的调理行列步队中,异步实行闭包中的操纵。

  • `performAndWait(_:)` 办法在托管工具上下文的调理行列步队中,同步实行闭包中的操纵。

除非你完全确定你在利用准确的线程拜访托管工具上下文,不然你应该利用 `perform(_:)` 大概 `performAndWait(_:)` 来制止遇到线程题目。

2.跨线程通报托管工具

别的一个开辟者常犯的错误是跨线程通报托管工具。好比,当使用步伐从近程后端获取数据时,这一错误并不稀有。你必要遵照的规矩很复杂,你永久都不该该将一个 `NSManagedObject` 工具从一个线程通报到另一个线程。`NSManagedObject` 类并不是线程宁静的。

但是这看上去好像很不利便。办理方案很复杂,Core Data 框架提供了一个跨线程通报托管工具的办理方案: `NSManagedObjectID` 类。这个类的一个实例独一标识步伐中

某一个托管工具。紧张的是,`NSManagedObjectID`这个类是线程宁静的。

你不该该再从一个线程通报托管工具到另一个线程,而是通报 `NSManagedObjectID` 工具。你可以经过一个 `NSManagedObject` 的 `objectID` 属性来获取它的独一标识。

1
let objectID = managedObject.objectID

托管工具上下文晓得怎样经过你通报的 `NSManagedObjectID` 工具来获取对应的托管工具。现实上,`NSManagedObjectContext` 类提供了好几个办法来依据`NSManagedObjectID` 工具获取对应的托管工具。

  • object(with:)

  • existingObject(with:)

  • registeredObject(for:)

每个办法都吸收一个 `NSMangedObjectID` 工具作为参数。

1
2
3
4
5
6
7
8
9
let objectID = managedObject.objectID
 
DispatchQueue.main.async {
    ...
    
    let managedObject = mainManagedObjectContext.object(with: objectID)
 
    ...
}

第一个办法, `object(with:)` ,前往一个与 `NSManagedObjectID` 实例对应的托管工具。假如托管工具上下文中不包括一个与这个标识对应的托管工具,它就会去耐久化存储和谐器(Persistent store coordinator)中查找。这个办法一直前往一个托管工具。

要理解的是,`object(with:)` 办法在找不到与独一标识对应的托管工具时,会抛出非常。好比,假如使用步伐删除了与独一标识对应的记载,Core Data 不克不及够前往对应的托管工具,后果便是抛出一个非常。

`existingObject(with:)` 办法与之相似。次要的区别是,假如托管工具上下文找不到与这个独一标识对应的托管工具时,会抛出一个错误。

第三个办法,`registeredObject(for:)` 只要在你所要获取的托管工具曾经在托管工具上下文中注册过,才会前往这个托管工具。换而言之,前往值是可选范例的 `NSManagedObject?` 。假如托管工具上下文在耐久化存储和谐器中找不到对应的记载,它将不会前往托管工具。

托管工具的标识与数据库中的对应记载的主键很类似,但并不完全相反。它独一标识这条记载,而且使得你的使用步伐可以获取到某条指定的记载,而不必去管以后的操纵是在哪个线程。

3.疏忽底子知识

现在为止,开辟者最常犯的错误,应该是疏忽了 Core Data 的根本原理。开辟者没有花工夫去研讨此中的原理,以是在遇到题目大概失掉与本人希冀纷歧样的后果时会感触狐疑。

别纠结,渐渐来,多花点工夫学习 Core Data,能增加你许多狐疑和糜费的工夫。Core Data 不是 UIKit 大概 Foundation 。你不克不及只选择去学习你想利用的局部。这篇文章介绍了 Core Data 有一些非常严厉的规矩你必要去遵照。假如你花点工夫来学习这些规矩,你会收获颇丰[shōu huò pō fēng]。

假如你下定决计要学好Core Data,那你可以选择我的课程 [] 。不到三个小时的工夫,你就可以学习到怎样把Core Data整合到你的项目中去。Core Data并不难,这一点我可以向你包管。