我的所有数据创建都在ExtensionDelegate.swift
完成。
问题ExtensionDelegate.swift
在getCurrentTimelineEntryForComplication
中的ComplicationController.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)")
}
答案 0 :(得分:2)
TL / DR:扩展告诉ClockKit
在收到数据后更新并发症。
第一期:
所以我的数组extEvnts在我的ComplicationController.swift中是空的...因为我的ExtensionDelegate.swift还没有被调用,这就是为数组创建数据的原因
您的数组为空,因为此时尚未接收数据。
你不能(让并发症控制器)强制观察(扩展)接收可能尚未发送的数据。
如果您查看要在后台传输的WCSession Class Reference,transferUserInfo
个队列数据,系统会决定发送信息的时间。
请记住,后台转移不会立即发送。系统尽可能快地发送数据,但传输不是即时的,系统可能会略微延迟传输以提高功耗。此外,发送大型数据文件需要相应的时间将数据传输到另一个设备并在接收端处理它。
第二期:
您正在尝试根据手机发送的数据合并更新您的应用和并发症。但是你的应用程序和你的并发症不一定是一起运行的。在任何数据发送/接收之前,手表更新并发症并不奇怪或意外。 App Programming Guide for watchOS提及
并发症完全存在于WatchKit扩展中。他们的用户界面未在Watch应用程序中定义。相反,它由实现CLKComplicationDataSource协议的对象定义。当watchOS需要更新您的复杂功能时,它会启动您的WatchKit扩展。但是,Watch应用程序的可执行文件未启动。
复杂控制器有 no 机制说,&#34;等等,我还没有准备好提供更新。并发症控制器无法等待(或如上所述,强制)手表扩展程序接收数据。
唯一的责任是根据当前可用的数据立即返回数据。如果没有数据,则必须返回空时间轴。
解决此问题:
您不应该将应用更新和并发症更新视为同一件事。第一个没有预算,但第二个是预算。如果您经常更新并发症,则可能会超出每日预算,并且在当天的剩余时间内不会再进行更新。
并发症并不是经常更新的。并发症应在每个更新周期中提供尽可能多的数据。您不应该要求系统在几分钟内更新您的并发症。您应该提供持续数小时或一整天的数据。
在完成此操作后,您可以等到您的扩展程序收到数据,然后可以要求ClockKit
延长您的时间表,以便可以添加新条目。 CLKComplicationServer
Class reference中记录了extendTimelineForComplication:
。
另外,如果您的数据很紧急,则应使用transferCurrentComplicationUserInfo
。它是一个高优先级的消息,放置在队列的头部,并且唤醒扩展以接收它。请参阅this answer,了解它与transferUserInfo
之间的对比。
您还可以设置一个单例来保存手表应用程序和并发症控制器都使用的数据。这是mentioned in an answer to an old question of yours,还有recommended by an Apple employee on the developer forums。
答案 1 :(得分:2)
帮助我的有用问题here
在函数requestedUpdateDidBegin()
中,您可以更新将在并发症中显示的信息。因此,在此方法中,您可以使用sendMessage:replyHandler:errorHandler:等WatchConnectivity
方法拨打父应用,以接收新信息。
您可以使用NSUserDefaults
存储将在ComplicationController
中使用的命令性数据,然后从NSUserDefaults
加载此信息以用于您的并发症。我将这些数据存储在用户默认值中,以便在新数据无法加载时始终显示旧数据。