在块,核心数据,迅速中使用弱,强大的自我使用



当前,我正在通过遵循

来获取核心数据
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.很好,并且没有理由添加弱参考的复杂性。

相关内容

  • 没有找到相关文章

最新更新