ios “查找X”操作,带有接受动态AppEntity的筛选器选项

xqnpmsa8  于 5个月前  发布在  iOS
关注(0)|答案(1)|浏览(98)

我试图扩展我的阅读-AppEntity的“查找XYZ”操作,以接受另一个Meter-AppEntity类型的过滤。因此,基本上我希望获得与同一对象具有Core Data关系的所有元素。尽管如此,由于某些原因,过滤无法按预期工作,并且忽略了我选择过滤的AppEntity

设置

在我的数据库中,我有一个 Meter,它与 Readings 有关系。我已经将我的Core Data实体桥接到AppEntity协议,以通过以下方式在Shortcuts中使用它:

struct ReadingEntity: AppEntity, Identifiable {
    var id: UUID
    
    @Property(title: "Value")
    var value: Double
    @Property(title: "Meter")
    var readingMeter: MeterEntity
    
    
    // Visual representation and other required stuff …
    
    // Create IntentEntity from Core Data Object
    init(from reading: Reading) {
        self.id = reading.wrappedID
        self.value = reading.value
        
        // Link to Meter
        if let meter = reading.meterRelationship {
            self.readingMeter = MeterEntity(from: meter)
        }
    }
}

struct MeterEntity: AppEntity, Identifiable {
    var id: UUID
    
    @Property(title: "Title")
    var title: String
    // …
    
    
    // Visual representation and other required stuff …
    
    // Create IntentEntity from Core Data Object
    init(from meter: Meter) {
        self.id = meter.wrappedID
        self.title = meter.wrappedTitle
    }
}

字符串
为了支持 * 查找阅读 * 操作,我实现了过滤器选项(除了其他必需的东西):

struct ReadingIntentQuery: EntityPropertyQuery {
    // Other required functions

    // Filter Options
    static var properties = EntityQueryProperties {
        Property(\ ReadingEntity.$readingMeter) {
            EqualToComparator { NSPredicate(format: "readingMeter.id = %@", $0.id as CVarArg) }
        }
    }

    // Handling of Filtering
    func entities(
        matching comparators: [NSPredicate],
        mode: ComparatorMode,
        sortedBy: [EntityQuerySort< ReadingEntity >],
        limit: Int?
    ) async throws -> [ReadingEntity] {
        // Custom Predicate
        let predicate = NSCompoundPredicate(type: mode == .and ? .and : .or, subpredicates: comparators)

        // Custom sorting handling …
        
        return try IntentsDataHandler.shared.getReadings(matching: predicate, sortedBy: sortDescriptors, limit: limit)
    }
}


问题
我遇到的问题是,无论我在 *Find阅读 * 下拉列表中选择哪个 MeterEqualToComparator总是返回下拉列表中第一个Meter对象的ID。出于某种原因,它甚至返回这个第一个meter-ID,即使没有选择任何东西。不知道为什么过滤器操作中的选择在这里被忽略.
x1c 0d1x的数据
看起来像是逻辑问题。不过,我不知道我做错了什么。也许有人能帮我?

muk1a3rh

muk1a3rh1#

正如评论中提到的,这是iOS 17引入的一个问题,并在iOS 17.2中得到了修复。
上面的代码现在运行良好。

相关问题