如何将响应数据设置到 TodayExtension 小部件中

How to set response data into TodayExtenstion widget

正在尝试从服务访问响应数据以显示到 TodayExtenstion 小部件中

import Foundation

struct MarketIndex:Codable {

    let indicesName: String
    let indicesValue: String
    let dateValue : String
    let indicesChangeValue : String
    let changePercentage : String
    let indexVolume: String?
}

struct MarketIndexCache {
    static let key = "MARKET_INDEX_KEY"
    static func save(_ value: [MarketIndex]!) {
        UserDefaults.standard.set(try? PropertyListEncoder().encode(value), forKey: key)
    }
    static func get() -> [MarketIndex]! {
        var marketIndex: [MarketIndex]!
        if let data = UserDefaults.standard.value(forKey: key) as? Data {
            marketIndex = try? PropertyListDecoder().decode([MarketIndex].self, from: data)
            return marketIndex!
        } else {
            return marketIndex
        }
    }
    static func remove() {
        UserDefaults.standard.removeObject(forKey: key)
    }
}

MarketIndexClient 服务调用class 代码片段

marketIndexClient.fetchMarketIndex(symbol: "AAPL,MSFT"){ marketIndex in
    self.stockIndex = marketIndex
    completion()
    MarketIndexCache.save(self.stockIndex)
    self.dispatchGroupCalls.leave()

}

当尝试访问另一个 viewcontroller 能够获取保存的数据时。

override func viewDidLoad() {
    super.viewDidLoad()
    marketIndex = MarketIndexCache.get()
}

当尝试从 TodayWidgetViewController 访问它时,它的 returns 为零。

import UIKit
import NotificationCenter
class TodayWidgetViewController

    override func viewDidLoad() {
        super.viewDidLoad()

        marketIndex = MarketIndexCache.get()
        print(marketIndex as Any)

    }

两个目标的UserDefaults不会互相共享数据吗?

当我 select 以 projectName 为目标时,我是否需要配置 TodayExtenstion,以便当我的项目 运行 在设备上时两者需要相互同步。

我无法在 运行ning 应用程序项目时调试 TodayExtenstionWidget。

这是我在使用 TodayExtenstion 时发现的观察结果。

我不明白为什么 returns 没有!您的意见将真正指导我实现它。

错误信息:

在展开可选值时意外发现 nil 致命错误:在展开可选值

时意外发现 nil

为了您的目的,您应该使用应用程序组。这是一个常见的场景,你可以阅读这篇文章here in section "Sharing Data with Your Containing App". Then you can go deeper and read about How to Add an App to an App Group

这允许您在扩展程序和包含的应用程序之间共享数据。但这不会使您能够观察数据变化。

希望对您有所帮助,欢迎提问。

嘿,正如@LowKostKustomz 所解释的,您需要在主应用程序和扩展程序中激活应用程序组。然后在从主应用程序和扩展程序保存时,尝试

struct MarketIndexCache {
    static let key = "MARKET_INDEX_KEY"
    static let groupBundleID = <#you group identifier#>
    static func save(_ value: [MarketIndex]!) {
        let defaults = UserDefaults.init(suiteName: groupBundleID)
        defaults?.set(try? PropertyListEncoder().encode(value), forKey: key)
    }
    static func get() -> [MarketIndex]! {
        var marketIndex: [MarketIndex]!
        if let data = defaults?.value(forKey: key) as? Data {
            let defaults = UserDefaults.init(suiteName: groupBundleID)
            marketIndex = try? PropertyListDecoder().decode([MarketIndex].self, from: data)
            return marketIndex!
        } else {
            return marketIndex
        }
    }
    static func remove() {
        let defaults = UserDefaults.init(suiteName: groupBundleID)
        defaults?.removeObject(forKey: key)
    }
}