Ios 调用ExtensionLegate创建/刷新复杂度数据
我所有的数据创建都是在Ios 调用ExtensionLegate创建/刷新复杂度数据,ios,swift,watchkit,watchos-2,apple-watch-complication,Ios,Swift,Watchkit,Watchos 2,Apple Watch Complication,我所有的数据创建都是在extensionelegate.swift中完成的 问题是ExtensionDelegate.swift在myComplementController.swift中的函数GetCurrentTimeLineEntryForComplementation之前不会被调用 有什么想法吗?以下是我的代码和详细信息: 因此,我的数组extEvnts在我的复杂控制器中为空。swift: func getCurrentTimelineEntryForComplication(c
extensionelegate.swift
中完成的
问题是ExtensionDelegate.swift
在myComplementController.swift
中的函数GetCurrentTimeLineEntryForComplementation
之前不会被调用
有什么想法吗?以下是我的代码和详细信息:
因此,我的数组extEvnts
在我的复杂控制器中为空。swift
:
func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) {
let extEvnts = ExtensionDelegate.evnts
}
因为我的extensionelegate.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()
}
}
}
所以我尝试过类似的方法,但仍然无法使其工作,因为我仍然没有得到任何数据:
func someMethod() {
let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate
let dict = ExtensionDelegate.evnts
print("ExtensionDel.evnts: \(dict.count)")
}TL/DR:让分机告诉
ClockKit
在收到数据后更新并发症
第一期:
所以我的数组extEvnts在compliationcontroller.swift中是空的。。。因为我的extensionelegate.swift还没有被调用,这就是为数组创建数据的原因
您的阵列为空,因为此时尚未收到数据
您无法(让控制器)强制手表(分机)接收可能尚未传输的数据
如果您查看,transferUserInfo
在后台对要传输的数据进行排队,系统将决定何时发送信息
请记住,后台传输不会立即交付。系统尽可能快地发送数据,但传输不是即时的,系统可能会稍微延迟传输以提高功率使用。此外,发送大数据文件需要相当长的时间将数据传输到另一个设备并在接收端对其进行处理
第二期:
您正试图根据手机发送的数据将更新应用程序和复杂度结合起来。但你的应用程序和你的复杂事物并不一定同时运行。手表在发送/接收任何数据之前更新复杂度,这并不令人惊讶或意外。报告提到
并发症完全存在于WatchKit扩展中。他们的用户界面未在Watch应用程序中定义。相反,它是由实现CLKComplicationDataSource协议的对象定义的。当watchOS需要更新您的软件时,它会启动您的WatchKit扩展。但是,Watch应用程序的可执行文件未启动
复杂控制器没有机制说:“等等,我还没有准备好提供更新。复杂控制器不能等待(或如前所述,强制)手表扩展接收数据
它唯一的责任是根据当前可用的数据立即返回数据。如果没有数据,它必须返回空的时间线
处理此问题:
你不必将应用程序更新和复杂度更新视为同一件事。第一个没有预算,但第二个有预算。如果你过于频繁地更新复杂度,你可能会超出每日预算,并且在一天的剩余时间内不会再进行更新
并发症不应频繁更新。并发症应在每个更新周期中提供尽可能多的数据。您不应要求系统在几分钟内更新并发症。您应提供持续数小时或一整天的数据
在介绍完这些之后,您可以等到分机收到数据后,再要求ClockKit
扩展您的时间线,以便向其中添加新条目。extendedtimelineforcomplexion:
在中有说明
另外,如果您的数据很紧急,您应该使用TransferCurrentCompliationUserInfo
。这是一条高优先级消息,位于队列的最前面,并且会唤醒扩展以接收它。有关它与transferUserInfo
之间的比较,请参阅
您还可以设置一个单例来保存watch应用程序和Complexion controller都使用的数据。这是一个非常有用的问题,对我很有帮助 在函数
requestedUpdateDidBeagin()
中,您可以更新将在您的应用程序中显示的信息。因此,在这种方法中,您可以使用WatchConnectivity
方法调用父应用程序以接收新信息
您可以使用
NSUserDefaults
来存储将在您的CompliationController
中使用的命令数据,然后从NSUserDefaults
中为您的复杂性加载此信息。我将此数据存储在用户默认值中,以便在新数据加载失败时始终显示旧数据。您意识到这个问题你已经问了六次了。第一个问题:“你不能(让控制器)强迫手表(分机)接收可能还没有传输的数据。”因此,每次我运行Watch应用程序部分时,数据都会立即出现;我假设,至少出于模拟器的目的,它最初会立即收到数据,以防出现复杂情况。听起来不是这样吗?第二个问题:每次我运行Watch应用程序时,数据都会立即通过ExtensionLegate进入
。我知道可能会有后台延迟,但是为什么ExtensionDelegate
函数WCSession:
只会在从complexient而不是Watch应用程序调用数据时才会延迟?我认为WCSession:
方法不会在意是否是从complexient请求数据的complexient她比Watch应用程序更优秀,但如果是Watch应用程序,它似乎会立即运行,但如果是复杂的应用程序,它不会立即运行
func someMethod() {
let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate
let dict = ExtensionDelegate.evnts
print("ExtensionDel.evnts: \(dict.count)")