Ios swift 2核心数据谓词不一致

Ios swift 2核心数据谓词不一致,ios,core-data,swift2,xcode7,Ios,Core Data,Swift2,Xcode7,我对核心数据的谓词方法有一个问题,因为它返回的结果似乎有些不一致。我有一个从web API填充的“用户”实体,而不是删除所有条目然后下载并添加用户,我更喜欢将所有用户的标志“isModified”设置为false,然后通过API下载用户并根据用户是否在商店中更新或添加用户,设置“isModified”在添加/更新它们时进行标记。最后,代码将删除未设置“isModified”标志的所有用户。我这样做是因为如果web API不可用,我不会失去所有用户,并且应用程序可以继续工作 我遇到的问题是,删除未

我对核心数据的谓词方法有一个问题,因为它返回的结果似乎有些不一致。我有一个从web API填充的“用户”实体,而不是删除所有条目然后下载并添加用户,我更喜欢将所有用户的标志“isModified”设置为false,然后通过API下载用户并根据用户是否在商店中更新或添加用户,设置“isModified”在添加/更新它们时进行标记。最后,代码将删除未设置“isModified”标志的所有用户。我这样做是因为如果web API不可用,我不会失去所有用户,并且应用程序可以继续工作

我遇到的问题是,删除未设置“isModified”标志的用户的方法是删除已更新的用户

方法如下:

func deleteUsersNotUpdated() -> Bool {
  // default result
  var result = false

  // setup the fetch request
  let fetchRequest = NSFetchRequest(entityName: "Users")

  // set a predicate that filters only records with updated set to false
  fetchRequest.predicate = NSPredicate(format: "isModified == %@", false)

  do {
    let fetchResults = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
    for user in fetchResults {
      print("Deleting \(user)")
      self.managedObjectContext.deleteObject(user)
      try self.managedObjectContext.save()
    }
    result = true
  } catch let error as NSError {
    print("\(error)")
  }
  return result
}
该方法大部分有效,但会断断续续地删除用户,原因不明,即即使设置了“isModified”标志,例如,这是行的输出:print(“删除(用户)”)

删除(实体:用户;id:0x7b64abd0;数据:{
created=“2016-01-17 16:54:21+0000”;
familyName=Doe;
吉文纳姆=约翰;
isModified=1;
引脚=3932;
类型=工作人员;
})
正如您所看到的,“isModified”标志是非常明确地设置的,但是谓词应该只选择具有标志重置(false)的记录

上面的方法是我创建的类的一部分,它基本上是Users实体的CRUD类

在这里搔我的头!
如果需要,我可以提供其余的代码。

对于布尔值,请使用布尔文字而不是对象占位符
%@


不要在重复循环的每次迭代中调用
context.save()
,在重复循环后调用它一次。

对于布尔值,使用布尔文字而不是对象占位符
%@


不要在重复循环的每次迭代中调用
context.save()
,在重复循环后调用它一次。

我认为您的代码看起来非常好(尽管您应该在循环外保存)。在大多数情况下,Swift布尔型会自动转换为
NSNumber
,然后再转换回来。有许多有效的方法可以编写这个谓词

我想到的唯一可能的解释是另一个类正在使用相同的托管对象上下文修改获取的对象。如果你有一个单一的上下文应用程序,这是一个可以想象的场景


避免这种情况的标准方法是在背景上下文中进行更改

我认为您的代码看起来非常好(尽管您应该在循环外保存)。在大多数情况下,Swift布尔型会自动转换为
NSNumber
,然后再转换回来。有许多有效的方法可以编写这个谓词

我想到的唯一可能的解释是另一个类正在使用相同的托管对象上下文修改获取的对象。如果你有一个单一的上下文应用程序,这是一个可以想象的场景


避免这种情况的标准方法是在背景上下文中进行更改

是的,试过了,没什么区别。仅供参考,大约有20条记录,每次我运行应用程序时,其中一条可能会被删除,有时一条也没有,而且每次都是随机记录,根本不一致。是的,试过了,没什么区别。仅供参考,大约有20条记录,每次我运行应用程序时,其中一条可能会被删除,有时一条也不会删除,而且每次都是随机记录,根本不一致。这足以提供线索,使我能够解决问题:-)在dataTaskWithUrl方法的关闭中,该方法从包装应用程序所需的web API中获取数据dispatch_async(dispatch_get_main_queue(),{})中的“将数据保存到核心数据”代码-谢谢!这足以为我解决问题提供线索:-)在关闭dataTaskWithUrl方法时,该方法从web API获取数据,我需要将“将数据保存到核心数据”代码包装到dispatch_async(dispatch_get_main_queue(),{})-谢谢!
Deleting <NSManagedObject: 0x7b6d6ec0> (entity: Users; id: 0x7b64abd0 <x-coredata://1A7606EB-3539-4E85-BE1C-15C722AD7125/Users/p14> ; data: {
    created = "2016-01-17 16:54:21 +0000";
    familyName = Doe;
    givenName = John;
    isModified = 1;
    pin = 3932;
    type = STAFF;
})
NSPredicate(format: "isModified == FALSE")