返回ObjectsAsFaults 未按预期工作

Posted

技术标签:

【中文标题】返回ObjectsAsFaults 未按预期工作【英文标题】:returnsObjectsAsFaults not working as expected 【发布时间】:2018-03-21 19:30:30 【问题描述】:

我创建了一个核心数据对象如下:

@objc(Gates)
public class Gates : NSManagedObject 

    public class func getFetchRequest() -> NSFetchRequest<Gates> 
        let request = NSFetchRequest<Gates>(entityName: "Gates")
        request.returnsObjectsAsFaults = false
        return request
    

    @NSManaged var updatedAt: String
    @NSManaged var objectId: String
    @NSManaged var identifier: String
    @NSManaged var name: String
    @NSManaged var address: String
    @NSManaged var dueDate: String
    @NSManaged var productionCode: String
    @NSManaged var locationCountry: String
    @NSManaged var locationCity: String
    @NSManaged var locationBuilding: String
    @NSManaged var locationLevel: String
    @NSManaged var locationRoom: String
    @NSManaged var locationRange: String
    @NSManaged var isFavorite: Bool

    public func setGateData(gateDict: [String: Any]) 
        updatedAt = gateDict["updatedAt"] as? String ?? ""
        objectId = gateDict["objectId"] as? String ?? ""
        identifier = gateDict["identifier"] as? String ?? ""
        name = gateDict["name"] as? String ?? ""
        isFavorite = gateDict["isFavorite"] as? Bool ?? false
        address = gateDict["address"] as? String ?? ""
        dueDate = gateDict["dueDate"] as? String ?? ""
        productionCode = gateDict["productionCode"] as? String ?? ""
        locationCountry = gateDict["locationCountry"] as? String ?? ""
        locationCity = gateDict["locationCity"] as? String ?? ""
        locationBuilding = gateDict["locationBuilding"] as? String ?? ""
        locationLevel = gateDict["locationLevel"] as? String ?? ""
        locationRoom = gateDict["locationRoom"] as? String ?? ""
        locationRange = gateDict["locationRange"] as? String ?? ""
    

我也在 xcdatamodeld 中设置了这个:

现在,在我将对象保存在核心数据中之后,我正在使用 getFetchRequest() 方法,该方法是设置类的一部分 request.returnsObjectsAsFaults = falserequest 上,但是当我尝试打印获取的对象时仍然得到以下结果:

 <Gates: 0x60c0000959a0> (entity: Gates; id: 0xd000000005e40000 <x-
 coredata://B9C33A5D-BF96-433A-9186-F51AA253F488/Gates/p377> ; data: <fault>)

如您所见,在这种情况下,数据仍然是data: &lt;fault&gt;

为什么我设置了request.returnsObjectsAsFaults = false,对象参数还是没有取到?我错过了什么?

【问题讨论】:

一个常见的原因是,如果您的 fetch 请求是从响应父上下文而不是直接响应持久协调器的子上下文执行的。试试moc.persistentCoordinator.fetch... 而不是moc.fetch... 嗨,埃米尔。作为一个 25K 的用户,我希望你知道这里需要一个技术标准的写作。如果您可以避免因您的问题而提前添加,那将减少志愿编辑的工作量。此外,标题应该是独立的——它们最后不应该有一个冒号。感谢您在以后的帖子中避免这些事情! @halfer,说实话,有几个星期我看到你专门编辑我的问题或答案。是的,我喜欢提前感谢人们的帮助以及在他们帮助我之后,是的,我喜欢通过加粗我的问题的位置来让人们关注我真正的问题,因为也许他们甚至不必阅读所有内容解释,只知道标记问题的答案。在您开始编辑我的问题之前,我没有看到其他人对此感到困扰。因此,如果这让您感到困扰,我建议您不要系统地访问我的问题和答案。 @halfer,好的,我浏览了您提供的链接。我还注意到的一件事是,没有理由仅仅为了删除“提前致谢”而编辑帖子,这是您对我帖子的大部分编辑。现在,让我问你一个问题。你怎么知道删除“问题是”并没有导致这个问题仍然没有答案?也许如果人们看到这一点并且知道问题的焦点是什么,他们会更愿意为焦点问题提供答案? 那么如果您在我的问题中留下“问题是”,我将非常感激。在我看来,它让人们关注手头的问题。这样做的一个原因是,对于这里的很多人来说,英语并不是他们的第一语言,因为它不适合我,这只是让他们看到问题中最重要的部分是什么。我不介意你去掉“谢谢”。 【参考方案1】:

我遇到了这个问题,我发现在我的案例中,我没有使用行中的对象值,而是先用它初始化一个变量,然后使用该变量。

我很想知道这是 Core Data 错误还是我做错了什么。

public class Person: NSManagedObject, Identifiable 
    @NSManaged public var firstName: String
    @NSManaged public var lastName: String
    @NSManaged public var emailAddress: String

这并不总是有效:


CoreDataManager.shared.persistentContainer.performBackgroundTask context in
    context.automaticallyMergesChangesFromParent = true
    context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    
    do 
        let email = "123Tester@gmail.com"
        let request = Person.getPersonWith(email: email)
        request.returnsObjectsAsFaults = false //DOES NOT WORK
        
        if let person = try context.fetch(request).first
            print(person.fullName)
        
     catch
        fatalError()
    

不过如此

CoreDataManager.shared.persistentContainer.performBackgroundTask context in
    context.automaticallyMergesChangesFromParent = true
    context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    
    do 
        let email = "123Tester@gmail.com"
        let request = Person.getPersonWith(email: email)
        
        if let person = try context.fetch(request).first
            let fullName = person.fullName
            print(fullName)
        
     catch
        fatalError()
    

【讨论】:

以上是关于返回ObjectsAsFaults 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

无法从异步函数获取返回值,等待未按预期工作(Vue API 服务)

从 views_php 过滤器返回 TRUE 未按预期工作

NestJs mongoose 嵌套填充未按预期工作

颤振异步等待未按预期工作

Google 位置设置未按预期工作

javax.persistence NamedQuery 未按预期工作