У меня проблема с производительностью (я думаю) моего виджета. Позвольте мне сначала объяснить, чего я хочу достичь.
Я пытаюсь создать интерактивный виджет, который действует как калькулятор. Код работает хорошо, но виджет не очень отзывчив, если я пытаюсь быстро нажать кнопки.
Я нашел хороший пример, такой как этот, который работает хорошо при быстром нажатии кнопок: https://apps.apple.com/us/app/calculato ... 6465680493
Есть ли у вас предложения по возможным улучшениям? Я думал о производительности пользовательских настроек по умолчанию, но не знал, что и думать, так как использую там лишь некоторые базовые вещи.
Спасибо за помощь.
Вот намерение, которое я использую при нажатии кнопок:
struct CalculatorDigitIntent: AppIntent {
static var title: LocalizedStringResource = "Calculator"
@Parameter(title: "Digit")
var digit: String
init() {}
init(digit: String) {
self.digit = digit
}
func perform() async throws -> some IntentResult {
UserDefaults.standard.double(forKey: "calculatorAmount")
var calculatorAmount = UserDefaults.standard.double(forKey: "calculatorAmount")
switch digit {
case "00":
if calculatorAmount != 0 {
calculatorAmount *= 100
}
case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
if let digit = Double(digit) {
if calculatorAmount != 0 || digit != 0 {
calculatorAmount = calculatorAmount * 10 + digit
}
}
default:
break
}
UserDefaults.standard.set(calculatorAmount, forKey: "calculatorAmount")
return .result()
}
}
Вот поставщик временной шкалы:
struct CalculatorProvider: AppIntentTimelineProvider {
func placeholder(in context: Context) -> FXWCalculatorEntry {
CalculatorEntry(date: Date(), amount: 0.0)
}
func snapshot(for configuration: ConfigurationAppIntent, in context: Context) async -> CalculatorEntry {
CalculatorEntry(date: Date(), amount: 0.0)
}
func timeline(for configuration: ConfigurationAppIntent, in context: Context) async -> Timeline {
let digits = getCalculatorDigits()
let entry = CalculatorEntry(date: Date(), amount: digits)
let timeline = Timeline(entries: [entry], policy: .never)
return timeline
}
func getCalculatorDigits() -> Double {
return UserDefaults.standard.double(forKey: "calculatorAmount")
}
}
Насколько я понимаю из документации, каждый раз, когда вызывается намерение приложения, временная шкала будет обновляться.
В моем коде представления я просто есть простые кнопки, подобные этой:
Button(intent: CalculatorDigitIntent(digit: "4")) {
Text("4")
.font(.system(size: 20).bold())
.foregroundStyle(Color(hex: "#252F2C"))
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... pp-intents