izzy27
V2EX  ›  Swift

ios 17 widget 无法正确更新 core data

  •  
  •   izzy27 · Jun 17, 2024 · 2411 views
    This topic created in 716 days ago, the information mentioned may be changed or developed.

    我正在开发的一个 iOS 17 Widget ,它可以为用户的 Thing 对象进行打卡。

    当我同时创建多个 Widget 实例时,无论点击哪个 Widget 实例进行打卡,它们更新的都是第一个 Thing ,看起来多个 Widget 都重复指向了同一个 Thing 。

    我后面经过排查,发现是我的 AppIntent 中,Parameter 并不起作用,用户无论选择哪个 thing,perform 中的 thing 都是 EntityQuery 中的 defaultResult 的返回值

    struct ConfigurationAppIntent: WidgetConfigurationIntent {
        @Parameter(title:"Select thing")
        var thing: ThingData
        
        func perform() async throws -> some IntentResult {
                print("perform thing: \(thing)") // 这里会直接返回 defaultResult 的结果,而不是用户选择的 thing
    	}
    }
    
        // EntityQuery 中的代码
        // AppIntent 中的 thing ,永远是这里的返回结果,而不是用户选择的结果
        func defaultResult() async -> ThingData? {
            logger.info("Entering defaultResult()")
            
            let context = PersistenceController.shared.viewContext
            let fetchRequest: NSFetchRequest<Thing> = Thing.fetchRequest()
            fetchRequest.fetchLimit = 1
    
            do {
                let things = try context.fetch(fetchRequest)
                things.forEach { logger.info("Default Thing: \($0.description)") }
                logger.info("Exiting defaultResult()")
                return things.first?.toThingData()
            } catch {
                logger.error("Error fetching default result: \(error.localizedDescription)")
                logger.info("Exiting defaultResult()")
                return nil
            }
        }
    

    而且这样会有一个问题,比如说我有五六个 thing ,用户为每个 thing 都添加了一个 widget ,但是由于这个 bug 的存在,导致只有 defaultResult 返回的 Thing 会更新,其他都不会更新

    哪位大佬知道怎么解决吗?修了两天了,文档、视频、教程看了一遍,都没发现解决办法。。真的很痛苦 T_T

    izzy27
        1
    izzy27  
    OP
       Jun 17, 2024
    解决了各位,调用的时候得加上初始化参数,不然会使用默认的 defaultResult
    ```
    if let thing = entry.thingData{
    Button(intent: ConfigurationAppIntent(thing: thing)){
    Image(systemName: "checkmark")
    }
    }
    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   931 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 21:40 · PVG 05:40 · LAX 14:40 · JFK 17:40
    ♥ Do have faith in what you're doing.