objective-c - Obj-C、NSTimer 循环调度,正确的模式?

标签 objective-c cocoa grand-central-dispatch nstimer

我有一个完成处理程序(它在 Web View 中评估 javascript),在其中我调用 NSTimer,我已将其包装到一个函数中......

-(void)runJSAndGoto: (WKWebView*)web
                 js: (NSString*)js
           selector: (SEL)aSelector
           position: (NSString*)position
        wait_period: (double)wait_period
          user_info: (id)user_info
{

    [web evaluateJavaScript:js completionHandler:^(id result, NSError * error) {

        [NSTimer scheduledTimerWithTimeInterval: wait_period
                                         target: self
                                       selector: aSelector
                                       userInfo: user_info
                                        repeats: NO;
        if(error)
        {
            NSLog(@"\n\n%@ error \n%@\n", position, error.description);
        }
    }];
}

所以我可以调用 javascript 的不同部分,并在完成后执行另一个函数,也许调用更多 javascript 等。

好的,这是我的问题...

后来我在循环中调用此函数,该函数又在完成时运行几个其他 javascript 调用。

  • 循环开始
    • 第一次 js 调用
      • 第一个js完成,等待2秒
        • 第二次 js 调用

你可以明白我的意思。基本上,循环中的第一个调用会运行很多次(直到第一个等待期),依此类推。有点乱。

  • 循环开始
    • 第一次通话
    • 第一次通话
    • 第一次调用等直到 2 秒过去
      • 第二次通话

我希望在下一个循环迭代开始之前完成完整的“堆栈”。 我正在编写一个 Mac 应用程序。

最佳答案

您可能正在寻找的标准模式是这样的:

- (void) doLoop: (NSInteger) i {
    NSLog(@"%li", i);
    if (i == 0) return;
    NSTimeInterval delay = 2;
    dispatch_time_t popTime = dispatch_time(
        DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {
        [self doLoop: i-1];
    });
}

如果您调用[self doLoop:5],这就是您在控制台中看到的内容(注意时间,间隔大约两秒):

2017-10-17 12:05:19.379507-0700 DelayLooper[1405:48726] 5
2017-10-17 12:05:21.563981-0700 DelayLooper[1405:48726] 4
2017-10-17 12:05:23.679977-0700 DelayLooper[1405:48726] 3
2017-10-17 12:05:25.863872-0700 DelayLooper[1405:48726] 2
2017-10-17 12:05:28.047187-0700 DelayLooper[1405:48726] 1
2017-10-17 12:05:30.247125-0700 DelayLooper[1405:48726] 0

您应该能够轻松地使其适应您想要做的任何事情。例如,您可以通过选择器列表并调用它们,而不是递减计数变量。

关于objective-c - Obj-C、NSTimer 循环调度,正确的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46797104/

相关文章:

c - Ubuntu 库分发

ios - GCD 问题和线程过多

objective-c - UILabel 文本没有改变,但是 xx.title 正在工作

ios - 如何使我的类(class)符合外部协议(protocol)?它找不到它,但我的印象是我不应该在 .h 文件中导入

ios - 混合 Swift 和 Objective C : "ProjectName-Swift.h" file not found

cocoa - 如何从另一个类重新加载表? - cocoa

cocoa - 如何向 NSSplitter handle 添加按钮?

iphone - 按下 UIWebView 中的 textField 时显示 ViewController

iphone - 如何在 objective-c 的 View 中加载两个图像?

swift - Dispatch Group 命令在代码中放在哪里?