问题描述
尝试从服务访问响应数据以显示到 TodayExtension 小部件中
Trying to access response data from service to show into TodayExtenstion Widget
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 服务调用类代码片段
MarketIndexClient Service Call class code snippet
marketIndexClient.fetchMarketIndex(symbol: "AAPL,MSFT"){ marketIndex in
self.stockIndex = marketIndex
completion()
MarketIndexCache.save(self.stockIndex)
self.dispatchGroupCalls.leave()
}
当尝试访问另一个能够获取保存数据的视图控制器时.
When Trying to access another viewcontroller able to get saved data.
override func viewDidLoad() {
super.viewDidLoad()
marketIndex = MarketIndexCache.get()
}
当尝试从 TodayWidgetViewController 访问它时,它返回 nil.
When trying to access its from TodayWidgetViewController its returns nil.
import UIKit
import NotificationCenter
class TodayWidgetViewController
override func viewDidLoad() {
super.viewDidLoad()
marketIndex = MarketIndexCache.get()
print(marketIndex as Any)
}
两个目标的 UserDefaults 是否不会相互共享数据?
Is UserDefaults for two targets will not share the data with each other?
当我选择目标项目名称时,我是否需要配置 TodayExtenstion,因此当我的项目在设备上运行时,两者都需要相互同步.
When I select target projectName do I need to configure the TodayExtenstion so both need to sync with each other when my project run on device.
在运行应用程序项目时,我无法调试 TodayExtenstionWidget.
I unable to debug TodayExtenstionWidget when running application project.
这是我在使用 TodayExtenstion 时发现的观察结果.
This are my observation found while working with TodayExtenstion.
我无法弄清楚为什么它的回报为零!您的意见将真正指导我实现它.
I am unable to figure it out why its returns nil! Your inputs will really guide me to achieve it.
错误信息:
在展开可选值时意外发现 nil致命错误:在展开可选值时意外发现 nil
推荐答案
嘿,正如@LowKostKustomz 解释的那样,您需要在主应用程序和扩展程序中激活应用程序组.然后在从主应用程序和扩展程序保存时,尝试类似
Hey as @LowKostKustomz explained, you need to activate app groups in both main app and extension. Then while saving from main app as well as extension, try something like
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)
}
}
这篇关于如何将响应数据设置到 TodayExtension 小部件中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!