在对并发症进行了几天的处理之后,我有信心对于以规定间隔发生的更新的更新过程进行以下说明:
requestedUpdateDidBegin()
reloadTimelineForComplication 如果您需要重置所有数据.extendTimelineForComplication 如果您只需要在并发症时间轴的末尾添加新项目.requestedUpdateBudgetExhausted()而不是requestedUpdateDidBegin()如果您在当天花费了太多的并发症时间预算.这就是这个问题的原因.reloadTimelineForComplication,系统将调用getCurrentTimelineEntryForComplication(以及获取阵列的未来和过去变体,具体取决于您的时间旅行设置)extendTimelineForComplication说只会getTimelineEntriesForComplication(... afterDate date: NSDate ...)被调用.getNextRequestedUpdateDateWithHandler以便您指定复杂性需要新更新的时间.Apple的文档非常明确,您不应该经常询问更新,或者在复杂化代码中进行太多处理,否则您将耗尽时间预算,并且您的并发症将停止更新.所以,我的问题是:你在何时何地进行更新?
对于上下文,我的方案是一个URL,其返回数据每小时最多更改两次.
放置URL获取代码最明显的地方是func requestedUpdateDidBegin()获取数据,存储它,如果没有变化,只需返回.如果有更改,则延长或重新加载时间线.
但是,URL提取可能会很昂贵.备择方案:
WCSession,但如果用户关闭该应用程序,则更新将不再发生.还有其他地方吗?我可以在手表应用程序中使用不属于复杂功能的周期性功能吗?获取并发症更新数据的正确位置在哪里?
我发现了许多问题和许多答案,但没有最后的例子请求:
任何人都可以在Objective C中给出最后一个示例,将WCSession与IOS应用程序和带有多个ViewController的Watch应用程序(WatchOS2)一起使用的最佳做法是什么.
到目前为止我注意到的是以下事实:
1.)在AppDelegate的父(IOS)应用程序中激活WCSession:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Any other code you might have
if ([WCSession isSupported]) {
self.session = [WCSession defaultSession];
self.session.delegate = self;
[self.session activateSession];
}
}
Run Code Online (Sandbox Code Playgroud)
2.)在WatchOS2侧使用<WCSessionDelegate>.但其余的对我来说完全不清楚!一些答案是通过在传递的字典中指定键来讨论,如:
[session updateApplicationContext:@{@"viewController1": @"item1"} error:&error];
[session updateApplicationContext:@{@"viewController2": @"item2"} error:&error];
Run Code Online (Sandbox Code Playgroud)
其他人正在讨论检索默认会话
WCSession* session = [WCSession defaultSession];
[session updateApplicationContext:applicationDict error:nil];
Run Code Online (Sandbox Code Playgroud)
其他人在谈论不同的队列?"如果有必要,客户有责任派遣到另一个队列.发送回主要队列."
我完全糊涂了.因此,请举例说明如何将WCSession与IOS应用程序和带有多个ViewController的WatchOS2应用程序一起使用.
我需要它用于以下情况(简化):在我的父应用程序中,我测量心率,锻炼时间和卡路里.在Watch应用程序1. ViewController我将在2显示心率和锻炼时间.ViewController我也将显示心率和燃烧的卡路里.
我在应用程序的关键时刻发生了崩溃.但是,崩溃似乎来自一个过度发布的UIView对象(更具体地说是UITableView的标题视图,在本例中是一个UISearch栏).关于这一点的奇怪之处在于它是从nib文件中实例化的.这是崩溃......

我已经设置了我的nib文件,以便与Apple在其中一个示例项目中完全匹配.

我也花时间用NSZombieEnabled和使用Instruments来分析它.但是,为什么会发生这种情况,我仍然无法做出正面或反面.这是保留/释放的配对....

并且在创建UIView对象时暴露堆栈跟踪.

此类错误的常见示例是创建NSError对象并将其分配给autorelease块中的out参数.但是,我不希望UIView看到同样的问题.我也没有在代码中的任何地方看到自动释放块(在主运行循环中保存一个).有关如何解决这个问题的任何想法?
我将数据从iOS传递到WatchKit. 我无法得到数据显示在WatchKit方面收到的某种方式.
这很好用:iOS TableViewController
func getCloudKit() {
///...
let publicData = container.publicCloudDatabase
publicData.performQuery(query, inZoneWithID: nil) { results, error in
if error == nil { // There is no error
for play in results! {
let newPlay = Play()
newPlay.tColor = play["TColor"] as! String
do {
try WatchSessionManager.sharedManager.updateApplicationContext(["color" : newPlay.tColor])
NSLog("NewPColor: %@", newPlay.tColor)
} catch {
print(error)
}
self.objects.append(newPlay)
}
} else {
print(error)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不是调用任何NSLogs或显示任何数据:WatchKitInterfaceController
import WatchConnectivity
class InterfaceController: WKInterfaceController, WCSessionDelegate {
@IBOutlet var …Run Code Online (Sandbox Code Playgroud) 我不敢didReceiveApplicationContext打电话。有任何想法吗?
InterfaceController:
import WatchKit
import Foundation
import WatchConnectivity
class InterfaceController: WKInterfaceController, WCSessionDelegate {
@IBOutlet var colorLabel: WKInterfaceLabel!
private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil
override init() {
super.init()
session?.delegate = self
session?.activateSession()
}
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
}
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]){
let colors : String = applicationContext["color"] as! String
colorLabel.setText(colors)
NSLog("session did receive application context")
}
}
Run Code Online (Sandbox Code Playgroud)
我一直在跟随本教程:http : //www.kristinathai.com/watchos-2-how-to-communicate-between-devices-using-watch-connectivity/
否NSLog或colorLabel …