【问题标题】:NSManagedObject is automatically set to faultNSManagedObject 自动设置为故障
【发布时间】:2014-10-07 19:11:45
【问题描述】:

我有以下课程:

class Profile {
  var state:State
  var member:Member?
}

class Member: NSManagedObject {
   @NSManaged var nickName: String?
   @NSManaged var mId: String?
}

问题位于以下类:

class RegisterMultiTableVContr: UITableViewController {

     var profile:Profile?

     override func viewDidLoad() {
         self.profileService.createEmptyProfile(
                 { (profile:Profile) in
                     self.profile = profile
                     println("\(self.profile!.member!.description)")
                     /*
                     Correct:
                     Output:
                     <meetpoll.Member: 0x7fd654175c10> (entity: Member; id: 0xd000000000c80000<x-coredata://21228B23-63B3-4708-8EAC-3302072BA074/Member/p5> ; data: {
                         mId = nil;
                         nickName = nil;
                     })
                     */
                 }, failure: { (error:String) in
                     // Exception Handling
             })
     }

     override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
         println("\(self.profile!.member!.description)")
         /*
         Set to fault automatically
         Output:
         <meetpoll.Member: 0x7fd654175c10> (entity: Member; id: 0xd000000000c80000<x-coredata://21228B23-63B3-4708-8EAC-3302072BA074/Member/p50> ; 
         data: <fault>)
         */
     }
}

仅在 viewDidLoad 之后调用 prepareForSegue 函数。我将 println 函数的输出写入源代码。 我的问题是,为什么对象成员自动设置为故障?我怎样才能将成员故障再次设置为假?

包括 2014-10-08

该函数创建一个带有 Member 对象的空配置文件,如下所示:

var member = NSEntityDescription.insertNewObjectForEntityForName("Member", inManagedObjectContext: context) as Member
var profile = Profile(member:member)
var error: NSError? = nil
if context.save(&error) {
   return profile
}

包括 2014-10-09

好的,我知道您需要更多信息,所以我写了一个迷你简单示例并加载到 GitHub https://github.com/qeychon/CoreDataBug/tree/master

【问题讨论】:

  • 这真的是个问题吗?错误只是意味着信息不在内存中,但如果你需要它会被提取......在某些情况下你应该关心它,如果你正在做一堆自定义排序或其他东西......但是通常你应该使用默认的错误行为
  • 故障是正常的,应该是可以预料到的。
  • 感谢您的回复。问题是,如果我使用 insertNewObjectForEntityForName 创建一个对象并保存,那么我可以在此后不久更改属性。在这个例子中,我看到同一个对象有时被设置为错误。是什么导致了这种变化?
  • 保存导致您看到的行为。
  • @quellish 你是对的!

标签: ios core-data swift


【解决方案1】:

你可以设置

[request setReturnsObjectsAsFaults:NO]

更新

抱歉,我从 iPhone 应用程序回复延迟

正如 quellish 所说,从 CoreData 中获取错误并没有错。 每个对象都将是“故障”,直到您需要访问它们的持久值,并且您可以强制核心数据通过设置来检索具有持久值的完整对象

[request setReturnsObjectsAsFaults:NO]

【讨论】:

  • @GameDroids,我看不出这里有什么歧义。 Adi Pop 在获取请求上说,将returnsObjectsAsFaults 设置为 NO。这样 Core Data 就不会从获取中返回对象作为错误。错误是默认行为,应该总是在意料之中。
  • 但是我没有实现FetchRequest,所以无法设置故障状态。我将此添加到我的问题中。
【解决方案2】:

我不知道为什么它会自动设置为故障,似乎在它们之间调用了其他东西。您可以使用

轻松地将您的对象变成故障或完整对象
  • [NSManagedObjectContext refreshObject:o mergeChanges: YES/NO]

YES 代表对象,NO 代表错误。

【讨论】:

  • Core Data 默认返回故障。
  • 是的,但不是在您创建它们时。这里创建了对象,然后在来自操作系统的两个回调之间变成了一个错误
  • 如果我将 mergeChanges 设置为 true 或 false,那么它总是错误的。这真的很奇怪
  • 好的,我已经在 Swift 中检查过了,但这没有任何效果。 managedObjectContext!.refreshObject(obj, mergeChanges: true) or false后,我可以改变obj的属性。
  • 合并更改 true/false 影响 cd 行缓存,不一定是完美的。如果对象在行缓存中,从故障中获取它的速度非常快。
【解决方案3】:

第一个对象可以更改的原因:Core Data 函数是异步执行的。因此,可以临时更改对象。一段时间后,方法 save 被调用(谢谢@quellish),突然对象被设置为只读(错误)。解决方法:必须稍后调用save方法!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2015-10-05
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多