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

Le *_*ced 1 scheduler ios game-center

这个问题有一些版本,其中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);
Run Code Online (Sandbox Code Playgroud)

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

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

gna*_*729 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, ^ (...));
Run Code Online (Sandbox Code Playgroud)

即使用户在两者之间调整时钟,也会在您想要的时间调度该块.

只是说:dispatch_after的行为有所不同,具体取决于您创建dispatch_time_t的方式.dispatch_time(DISPATCH_TIME_NOW,delta)返回基于mach_absolute_time的时间.dispatch_wall_time(...)返回一个待机时间.dispatch_after根据给定的时间而表现不同.