CoreData在上下文中删除对象

时间:2018-04-30 06:40:19

标签: ios swift core-data

问题:

  • 是否必须在NSManagedObject / context.perform阻止中删除context.performAndWait
  • 或者删除块外的对象是否安全?

代码:

func delete(something: NSManagedObject, context: NSManagedObjectContext) {

    context.performAndWait { //Is context.perform / context.performAndWait required to delete an object ?

        context.delete(something)
    }
}

我的想法:

  • 由于此代码是从不同的线程(背景/主要)调用的,因此最好使用context.perform / context.performAndWait
  • 可能已使用特定并发类型(主/私有队列)创建了上下文。
  • 上下文的并发类型需要与正在执行代码的线程(主/背景)匹配。
  • 即使具有不同不匹配线程类型的线程正在执行它,该块也会确保它运行正常。

2 个答案:

答案 0 :(得分:0)

根据我的个人经验,使用 CREATE TRIGGER `update_contribution` AFTER INSERT ON `tasks` FOR EACH ROW BEGIN IF NOT EXISTS (SELECT p_id ,d_id FROM contribution WHERE p_id = NEW.p_id AND d_id = NEW.d_id) THEN SET @old_total_dev_hours = (SELECT SUM(total_hours) FROM contribution WHERE p_id = NEW.p_id GROUP BY p_id); SET @total_hours1 = (SELECT (total_hours) FROM contribution WHERE d_id = NEW.d_id AND p_id = NEW.p_id ); SET @dev_con = @total_hours1/@old_total_dev_hours*100 ; SET @total_hours = new.hours + new.overtime; INSERT INTO contribution ( p_id, d_id, hours, overtime, total_hours, contribution ) VALUES (NEW.p_id, NEW.d_id, NEW.hours, NEW.overtime, @total_hours , @dev_con ); ELSE UPDATE contribution SET hours = hours + NEW.hours , overtime = overtime + NEW.overtime, total_hours = hours + overtime, contribution = @dev_con WHERE p_id = NEW.p_id AND d_id = NEW.d_id; END IF; END ,因为它会等到操作完成。无论如何,这两种方法都将在它自己的线程上运行。(上下文的线程)。

From Documentation:

  

执行( :)和performAndWait( :)确保块操作   在为上下文指定的队列上执行。表演( :)   方法立即返回,上下文执行块方法   在自己的线程上。使用performAndWait( :)方法,上下文   仍然在自己的线程上执行块方法,但方法   在块执行之前不会返回。

答案 1 :(得分:0)

  1. 在苹果文档中,人们正在谈论“......和等待”它的工作是同步的。 但是应该使用“...... andWait”来捕获执行块内的错误...

    Moc.performBlock { for jsonArray中的jsonObject { 让你的=行动 } 做{ 尝试moc.save()

    moc.performBlockAndWait { 做{try moc.save()} catch {fatalError(“无法保存上下文:(错误)”)} } } ...

  2. 如果你有不同的值/未使用的值,最好在里面做。在大多数情况下,ARC(内存管理)应该修复它。

  3. 你也应该在这里阅读:

      

    Core Data background context best practice