当前,我正在通过遵循
来获取核心数据CoreDataStack.sharedIntance.backgroundContext.performBlock({
let fetchRequest = NSFetchRequest(entityName: "Schedule")
let sortDescriptor = NSSortDescriptor(key: "startTime", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
var result = [Schedule]()
mainContext.performBlockAndWait { [unowned self] in
do {
result = try mainContext.executeFetchRequest(fetchRequest) as! [Schedule]
success?(result)
} catch {
print("error is (error)")
}
}
})
我会遇到错误
引用关闭中的属性MainContext需要明确的自我 使捕获语义显式
我注意到某些解决方案,并且它们在块中添加了该属性的self
。
做到这一点,还是应该创建一个 weak or unowned
以避免保留周期,什么是处理这种情况的最佳方法。
每次在块中使用 self
时,都必须考虑该块的未来,否则您可以创建一个参考周期和泄漏内存(这就是为什么Swift要求您明确说明)。当一个块捕获(对self
的强引用)时,通常会发生参考周期,而其他一些对象则将其固定在该块上,并且self
将其固定在该对象上。在该配置中,有一个循环包含self
和另一个对象,因此都无法划分。
当块是"每次X发生,请执行此操作"时,这最常发生这种情况。固定并执行通知的对象经常由想要通知的事物拥有。这可能是最常见的参考循环。通常通过使self
弱来解决。
performBlock
不是这种功能。它执行块,然后释放。迅速的术语是@noescape
(将来可能会以这种方式标记,并且您不需要在Noescape封闭中使用self.
)。在块执行块之前,self
不能被划分,但是在块执行后,周期立即被打破。那可能正是您想要的。因此,这里使用self.
很好,并且没有理由添加弱参考的复杂性。