5

我所有的数据创建都是在ExtensionDelegate.swift.

问题是在 myExtensionDelegate.swiftgetCurrentTimelineEntryForComplicationComplicationController.swift中的函数之前没有被调用

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

所以我的数组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()
        }
    }
}

编辑:

根据 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)")

}

4

2 回答 2

3

在这里帮助我的有用问题

在该功能requestedUpdateDidBegin()中,您可以更新将在并发症中显示的信息。因此,在此方法中,您可以使用sendMessage:replyHandler:errorHandler: 之WatchConnectivity类的方法调用父应用程序以接收新信息。

您可以使用NSUserDefaults来存储将在您ComplicationControllerNSUserDefaults. 我将此数据存储在用户默认值中,以便在新数据加载失败时始终显示旧数据。

于 2016-02-22T21:11:09.333 回答
3

TL/DR:让扩展程序在收到数据ClockKit通知更新并发症。

首要问题:

所以我的数组 extEvnts 在我的 ComplicationController.swift 中是空的......因为我的 ExtensionDelegate.swift 还没有被调用,这就是为数组创建数据的原因

您的数组为空,因为此时尚未收到数据。

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

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

请记住,后台传输不会立即交付。系统尽可能快地发送数据,但传输不是即时的,系统可能会稍微延迟传输以提高功耗。此外,发送大型数据文件需要相应的时间将数据传输到其他设备并在接收端进行处理。

第二题:

您正在尝试根据手机发送的数据将更新您的应用程序和您的并发症结合起来。但是您的应用程序和您的复杂功能不一定一起运行。手表在发送/接收任何数据之前更新复杂功能也就不足为奇了。watchOS的App Programming Guide提到

复杂性完全存在于 WatchKit 扩展中。他们的用户界面未在 Watch 应用程序中定义。相反,它由实现 CLKComplicationDataSource 协议的对象定义。当 watchOS 需要更新您的复杂功能时,它会启动您的 WatchKit 扩展。但是,Watch 应用程序的可执行文件未启动。

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

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

解决这个问题:

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

并发症并不意味着经常更新。并发症应在每个更新周期提供尽可能多的数据。您不应要求系统在几分钟内更新您的并发症。您应该提供持续数小时或一整天的数据。

涵盖了这一点,您可以等到您的扩展程序收到数据,然后可以要求ClockKit延长您的时间线,以便可以向其中添加新条目。extendTimelineForComplication:记录在CLKComplicationServerClass reference 中

顺便说一句,如果您的数据很紧急,您应该使用transferCurrentComplicationUserInfo. 这是一个高优先级的消息,它被放在队列的头部,扩展被唤醒来接收它。有关它和 的比较,请参见此答案transferUserInfo

您还可以设置一个单例来保存手表应用程序和复杂控制器都使用的数据。这在对您的一个老问题的回答中被提及,并且也是由 Apple 员工在开发者论坛上推荐的

于 2016-02-22T03:53:59.053 回答