为 Complication 调用 ExtensionDelegate 到 create/refresh 数据

Call ExtensionDelegate to create/refresh data for Complication

我所有的数据创建都是在 ExtensionDelegate.swift 中完成的。

问题是 ExtensionDelegate.swift 在我的 ComplicationController.swift.

函数 getCurrentTimelineEntryForComplication 之前没有被调用

有什么想法吗? 这是我的代码和详细信息:

所以我的数组 extEvnts 在我的 ComplicationController.swift:

中是空的
    func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) {

        let extEvnts = ExtensionDelegate.evnts
}

因为我的 ExtensionDelegate.swift 还没有被调用,这是为数组创建数据的原因:

class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate {

    private let session = WCSession.defaultSession()
    var receivedData = Array<Dictionary<String, String>>()
    static var evnts = [Evnt]()

    func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {

        if let tColorValue = userInfo["TeamColor"] as? String, let matchValue = userInfo["Matchup"] as? String {

            receivedData.append(["TeamColor" : tColorValue , "Matchup" : matchValue])
            ExtensionDelegate.evnts.append(Evnt(dataDictionary: ["TeamColor" : tColorValue , "Matchup" : matchValue]))

        } else {
            print("tColorValue and matchValue are not same as dictionary value")
        }

    }

    func applicationDidFinishLaunching() {
        // Perform any final initialization of your application.
        if WCSession.isSupported() {
            session.delegate = self
            session.activateSession()
        }
    }
}

编辑:

Per Apple,看起来这与它有关,但出于某种原因我不知道如何实际实现它,因为我无法调用 mydelegate.evnts:

// Get the complication data from the extension delegate.
let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate
var data : Dictionary = myDelegate.myComplicationData[ComplicationCurrentEntry]!

所以我已经尝试过类似的方法,但仍然无法正常工作,因为我仍然没有收到任何数据:

func someMethod() {
    let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate
    let dict = ExtensionDelegate.evnts
    print("ExtensionDel.evnts: \(dict.count)")

}

TL/DR:让扩展告诉 ClockKit 在 收到数据后更新并发症

第一期:

So my array extEvnts is empty in my ComplicationController.swift ... Because my ExtensionDelegate.swift hasn't gotten called yet, which is what creates the data for the array

你的数组是空的,因为那时还没有收到数据。

您不能(让复杂功能控制器)强制手表(扩展)接收可能尚未传输的数据。

如果您查看 WCSession Class ReferencetransferUserInfo 队列数据将在后台传输,当系统决定是发送信息的好时机。

Remember that background transfers are not be delivered immediately. The system sends data as quickly as possible but transfers are not instantaneous, and the system may delay transfers slightly to improve power usage. Also, sending a large data file requires a commensurate amount of time to transmit the data to the other device and process it on the receiving side.

第二期:

您正在尝试根据从您的 phone 发送的数据结合更新您的应用程序和您的复杂功能。但是您的应用程序和您的并发症不一定 运行 在一起。手表在任何数据 sent/received 之前更新复杂功能并不奇怪或意外。 App Programming Guide for watchOS 提到

Complications exist entirely in the WatchKit extension. Their user interface is not defined in the Watch app. Instead, it is defined by an object implementing the CLKComplicationDataSource protocol. When watchOS needs to update your complication, it launches your WatchKit extension. However, the Watch app’s executable is not launched.

复杂控制器没有没有机制说,“等等,我还没准备好提供更新。复杂控制器不能等待(或如前所述, 强制) 手表扩展接收数据。

它的唯一责任是立即return 根据当前可用的数据。如果没有数据,它必须 return 一个空的时间线。

解决这个问题:

您不必一定将应用程序更新和复杂功能更新视为同一件事。第一个没有预算,但第二个有预算。如果您过于频繁地更新您的并发症,您可能会超出您的每日预算,并且在一天的剩余时间内不会再进行更新。

Complications aren't meant to be frequently updated. Complications should provide as much data as possible during each update cycle. You shouldn't ask the system to update your complication within minutes. You should provide data to last for many hours or for an entire day.

说完这些,您可以等到您的扩展程序收到数据,然后可以要求 ClockKit 延长您的时间线,以便可以向其中添加新条目。 extendTimelineForComplication: 记录在 CLKComplicationServer Class reference.

顺便说一句,如果您的数据很紧急,您应该使用transferCurrentComplicationUserInfo。这是一条高优先级的消息,位于队列的头部,分机被唤醒接收它。请参阅 transferUserInfo 的比较。

您还可以设置一个单例来保存手表应用程序和并发症控制器都使用的数据。这是 , and also recommended by an Apple employee on the developer forums.

对我有帮助的有用问题

在函数 requestedUpdateDidBegin() 中,您可以更新将在复杂功能中显示的信息。因此,在此方法中,您可以使用 WatchConnectivity 方法(如 sendMessage:replyHandler:errorHandler: )调用您的父应用程序以接收新信息。

您可以使用 NSUserDefaults 存储将在 ComplicationController 中使用的命令式数据,然后从 NSUserDefaults 加载此信息以用于您的并发症。我将此数据存储在用户默认值中,以便在新数据无法加载时始终显示旧数据。