如何在Swift中准确安排iOS通话?

时间:2015-04-16 19:23:52

标签: ios game-center scheduler

这个问题有一些版本,其中OP说的是“如何在下午5点在我的应用程序中触发方法调用?”

然后人们回答“你怎么知道你的应用程序将在下午5点开放”?这成了另一个问题,原来的问题就消失了。

那么请避免这样做吗?

我们只想说,当我的用户在5:25:28:50打开应用程序时,我想在下午5:25和30秒发出一个方法调用。

如果不清楚,我的意思是我想要绝对时间我可以使用我的用户是否在5:25:26:35,5:25:20打开应用程序: 13,或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);

我就像“尤里卡!”直到我意识到a)我不知道如何进行将2038年1月19日变为0x7FFFFFFF的十六进制转换,b)我不明白如何构造timespec结构,以及如何添加小时和分钟进入,c)milestone = dispatch_walltime(&ts, 0)在Swift中抛出错误。

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

1 个答案:

答案 0 :(得分:5)

根据时区和夏令时创建一个NSDate(这有点棘手,但Stackoverflow上有很多答案)。然后

   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)返回基于mach_absolute_time的时间。 dispatch_wall_time(...)返回一个待机时间。 dispatch_after根据给定的时间而表现不同。