如何使我的小部件更频繁地更新或在应用程序内发生操作时更新

How do I make my widget update more frequently or update when an action happens within the app

我有一个小部件可以从我的应用程序中获取数据。该小部件工作正常,但更新不够频繁。理想情况下,id 喜欢它在我的应用程序中删除或添加项目时随时更新,因此如果有一种方法可以强制更新小部件,那就行得通了。否则,如果小部件可以更频繁地获取新数据,那么也可以正常工作。

数据存储在应用程序组的 json 文件中。我将该数据加载并解码到一个数组中,然后从该数组中随机选择一个项目进行显示。

这是小部件提供者:

let testBook = Book(id: UUID(), name: "Name", author: "Author", genre: "Error", page: "0", total: "77")

public enum AppGroup: String {
  case Livre = "group.com.identifier"

  public var containerURL: URL {
    switch self {
    case .Livre:
      return FileManager.default.containerURL(
      forSecurityApplicationGroupIdentifier: self.rawValue)!
    }
  }
}

struct Provider: TimelineProvider {
    func placeholder(in context: Context) -> SimpleEntry {
        SimpleEntry(date: Date(), book: testBook)
    }

    func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
        let entry = SimpleEntry(date: Date(), book: testBook)
        completion(entry)
    }

    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        var entries: [SimpleEntry] = []
            
        let currentDate = Date()
        for hourOffset in 0 ..< 5 {
            let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
            let books: [Book] = self.load("list")
            let entry = SimpleEntry(date: entryDate, book: books.randomElement() ?? testBook)
            entries.append(entry)
        }
            
        let timeline = Timeline(entries: entries, policy: .atEnd)
        completion(timeline)
        
    
    }
    
    func load<T: Decodable>(_ filename: String) -> T {
        let groupDirectory = AppGroup.Livre.containerURL
        let groupURL = groupDirectory
            .appendingPathComponent(filename)
            .appendingPathExtension("json")

        return try! JSONDecoder().decode(T.self, from: Data(contentsOf: groupURL))
    }
}

由于我是 widgetKit 的新手,我不确定我是否提供了足够的上下文,如果您需要更多信息或代码,请告诉我。

您始终可以使用下面的代码块从您的应用更新您的小部件。请注意,您需要 import WidgetKit 到您的 class 才能调用此函数。

WidgetCenter.shared.reloadAllTimelines()