Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 调用ExtensionLegate创建/刷新复杂度数据_Ios_Swift_Watchkit_Watchos 2_Apple Watch Complication - Fatal编程技术网

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
在my
ComplementController.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)")