小编El *_*Tea的帖子

何时何地获取Watch Complication的数据

在对并发症进行了几天的处理之后,我有信心对于以规定间隔发生的更新的更新过程进行以下说明:

  • 系统调用 requestedUpdateDidBegin()
    • 您可以在此处确定数据是否已更改.如果没有,您的应用程序不必做任何事情.如果您的数据已更改,则需要调用以下任一项:
      • reloadTimelineForComplication 如果您需要重置所有数据.
      • extendTimelineForComplication 如果您只需要在并发症时间轴的末尾添加新项目.
    • 注意:系统实际上可能会调用,requestedUpdateBudgetExhausted()而不是requestedUpdateDidBegin()如果您在当天花费了太多的并发症时间预算.这就是这个问题的原因.
  • 如果您打电话reloadTimelineForComplication,系统将调用getCurrentTimelineEntryForComplication(以及获取阵列的未来和过去变体,具体取决于您的时间旅行设置)
  • 这是猜想,因为我还没有测试它,但我相信如果你打电话extendTimelineForComplication说只会getTimelineEntriesForComplication(... afterDate date: NSDate ...)被调用.
  • 然后系统将调用,getNextRequestedUpdateDateWithHandler以便您指定复杂性需要新更新的时间.

Apple的文档非常明确,您不应该经常询问更新,或者在复杂化代码中进行太多处理,否则您将耗尽时间预算,并且您的并发症将停止更新.所以,我的问题是:你在何时何地进行更新?

对于上下文,我的方案是一个URL,其返回数据每小时最多更改两次.

放置URL获取代码最明显的地方是func requestedUpdateDidBegin()获取数据,存储它,如果没有变化,只需返回.如果有更改,则延长或重新加载时间线.

但是,URL提取可能会很昂贵.备择方案:

  • 将代码放在手机应用程序上并使用a发送WCSession,但如果用户关闭该应用程序,则更新将不再发生.
  • 使用推送更新,但这不是一个Web应用程序,所以我没有地方发送它们.
  • 显然,当用户与监视应用程序交互时,我将更新所有数据,但现在这意味着它只在用户使用应用程序时才会更新,从而无需复杂化.

还有其他地方吗?我可以在手表应用程序中使用不属于复杂功能的周期性功能吗?获取并发症更新数据的正确位置在哪里?

ios watchkit clockkit watchos-2 apple-watch-complication

29
推荐指数
1
解决办法
6674
查看次数

委托vs Unwind Segue将数据传递给父场景

从iOS 6开始,展开的segue可用于向上导航场景层次结构.我试图决定将数据传递给父视图控制器的更清洁/更好/首选/更可维护的方法.从技术角度来看,有一些问题可以解决这个问题(例如"如果我有一个放松,我还需要一个代表")但我找不到太多可以解决利弊的问题.

选项1:使用代表.

  • 通过传递父视图控制器作为遵守协议的委托来完成.
    • Child调用协议方法返回数据.
    • 如果Parent需要进行数据验证,则返回值/ dict以允许子进程处理错误.
  • 开销:协议定义和父级中的一种方法(用于数据验证和接收).

选项2:使用展开segue

  • 通过调用孩子的unwind segue来完成.
    • Child通过拖动按钮或故事板本身在其场景中添加segue Exit并命名segue以便它可以与performSegueWithIdentifier:sender
    • 父实现returnFromSegueName(链接到该segue的用户命名方法)从子进程中获取数据.
    • 数据验证虽然只能通过实施来实现 canPerformUnwindSegueAction:fromViewController:withSender
      • 数据验证失败将需要Child上的另一个属性,因为此方法仅接受BOOL作为返回值.
  • 开销:两种方法,一个额外的属性,以及Storyboard shenanigans.

总的来说,代表们感觉更干净,但也许过时了.我倾向于朝那个方向倾斜吗?

delegates objective-c ios segue

12
推荐指数
2
解决办法
5469
查看次数

在View Controller中初始化属性值的位置在哪里?

我有一个视图控制器具有确定其行为的属性.这些是由其父母设定的prepareForSegue.

这在我的程序中引发的潜在错误是有问题的父母不能保证设置属性,所以我想有一个默认值.在研究方面,我现在明白Objective C中的属性没有默认值.这给我留下了以下选项:

  • 在子视图的viewDidLoad方法中设置属性的默认值.然而,在调查中,viewDidLoad被称为 prepareForSegue父-所以当父母实际上并设置属性,我将覆盖父母的价值观.
  • 然后我想我可以(id) init用来初始化值,但是,至少在使用故事板时,根本不会调用此方法!

我可能有一个解决方法,对象将初始化为默认值,但在这种情况下,我想传入的所有内容都是BOOL.并且由于bool 即使没有正确初始化也会有一些价值,我无法测试它是否是非零的.

是否有机会prepareForSegue在父视图中初始化子视图控制器中的值?

properties objective-c ios segue

6
推荐指数
1
解决办法
2650
查看次数

Rails - 操作电缆上的服务器阻塞

我有一个在开发中完美运行的 Rails 应用程序。我已部署到服务器,应用程序加载并正确显示其登录页面和关于页面。但是,当我使用 Action Cable 转到页面时,服务器会阻止。从网页发出的最后一个请求与 Action Cable 相关,以及进一步的页面操作(表单提交,甚至重新加载)并且没有响应。

我已将它与服务器隔离,因为尝试从另一个浏览器加载站点的主页不起作用。关闭第一次向 Action Cable 发出请求的选项卡会立即加载另一个页面(并且突然处理来自第一页的所有待处理请求)。

我在 production.log 中没有看到任何错误,但这是导致挂起的部分:

I, [2018-01-24T21:12:38.601260 #9840]  INFO -- : [86b3fcc1-cebd-4d70-99ff-b6f9f147bc00]   Rendered collection of skill_checks/_skill_check.html.erb [5 times] (16.7ms)
I, [2018-01-24T21:12:38.601352 #9840]  INFO -- : [86b3fcc1-cebd-4d70-99ff-b6f9f147bc00]   Rendered rooms/show.html.erb within layouts/application (26.6ms)
I, [2018-01-24T21:12:38.602314 #9840]  INFO -- : [86b3fcc1-cebd-4d70-99ff-b6f9f147bc00] Completed 200 OK in 32ms (Views: 26.7ms | ActiveRecord: 1.8ms)
I, [2018-01-24T21:12:38.740061 #9840]  INFO -- : [5a06a7d8-a4a5-4ab4-8287-377dfa3447fe] Started GET "/cable" for 65.99.102.74 at 2018-01-24 21:12:38 +0000
I, [2018-01-24T21:12:38.740860 #9840]  INFO -- …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails actioncable

5
推荐指数
1
解决办法
1082
查看次数

Actioncable 使用了多少个 Redis 连接?

我正在考虑将应用程序的部署迁移到 Heroku,并且我想在进行迁移之前确定它是否可以在基本计划上正确运行。基本计划将 Redis 限制为 20 个连接。

我根本不了解 Rails/Redis 连接架构。是否存在与 Actioncable 的单个连接(然后由该连接分发数据),还是每个实际客户端的连接(即每个浏览器选项卡都有一个连接)?

ruby-on-rails redis actioncable

5
推荐指数
1
解决办法
1562
查看次数

核心数据:如何创建托管对象而不通过字符串引用实体

为了提高我的代码的可读性,我一直在为我的实体生成核心数据类,所以我可以使用getter和setter(我个人使用点符号)来访问它们而不是 setValue: forKey:

例如,而不是[aDateObject setValue:nameString forKey:@"name"];
我将使用:aDateObject.name = nameString;


我想知道是否有一个等效的方法将新的托管对象插入到托管对象上下文中.例如,我目前DateTimeFlightDataType使用以下内容创建一个新的:

    aDateObject = (DateTimeFlightDataType*)[NSEntityDescription insertNewObjectForEntityForName:@"DateTimeFlightDataType"
                                                                         inManagedObjectContext:self.managedObjectContext];
Run Code Online (Sandbox Code Playgroud)

有没有办法使用我的class(DateTimeFlightDataType)而不是实体字符串名称来创建和插入此对象以获得一致性?

xcode core-data ios

2
推荐指数
1
解决办法
1865
查看次数