如何在 Swift 的准确时间安排 iOS 通话?

How to schedule an iOS call at an exact time in Swift?

这个问题有一些版本,OP 说的是 "how do I fire a method call inside my app at exactly 5pm?"

然后人们回答"how do you know your app will be open at 5pm"?这变成了另一个问题,原来的问题消失了。

所以我们请避免这种情况?

假设我想在 5:25pm 和我的用户在 5:25:28:50 打开应用程序时的 30 秒触发方法调用。

如果不清楚,我的意思是我想要 绝对时间 我可以使用我的用户是否在 5:25:26:35、[=42] 打开应用程序=],或 5:29:49:99。

阅读所有关于 SO 的文章,似乎共识(以及 Apple 文档建议)是使用某种形式的 mach_absolute_time 和 dispatch_somethingOrOther。我只是找不到任何真实、具体的例子。

我找到的最接近的是 http://www.manpagez.com/man/3/dispatch_walltime/,它给出了这个例子:

 Create a milestone on Tuesday, January 19, 2038:

       struct timespec ts;
       ts.tv_sec = 0x7FFFFFFF;
       ts.tv_nsec = 0;
       milestone = dispatch_walltime(&ts, 0);

我就像 "eureka!" 直到我意识到 a) 我不知道如何将 2038 年 1 月 19 日变成 0x7FFFFFFF 的十六进制转换,b) 我不明白 timespec 构造,以及我如何将小时和分钟添加到其中,c) milestone = dispatch_walltime(&ts, 0) 在 Swift.

中抛出错误

有人可以帮忙吗?如果可能,请使用 5:25pm 和 30 秒的具体示例?

根据时区和夏令时,为你想要的时间创建一个 NSDate(这有点棘手,但在 Whosebug 上有很多答案)。那么

   struct timespec ts;
   ts.tv_sec = (int64_t) [date timeIntervalSince1970];
   ts.tv_nsec = 0;
   milestone = dispatch_walltime(&ts, 0);
   dispatch_after (dispatch_get_main_queue (), milestone, ^ (...));

块将在您想要的时间发送,即使用户调整了两者之间的时钟。

只是说:dispatch_after 的行为因您创建 dispatch_time_t 的方式而异。 dispatch_time (DISPATCH_TIME_NOW, delta) returns 基于 mach_absolute_time 的时间。 dispatch_wall_time (...) returns 墙时间。 dispatch_after 根据给定的时间表现不同。