【问题标题】:Run loop on main thread in osx and ios在 osx 和 ios 的主线程上运行循环
【发布时间】:2013-05-27 15:45:29
【问题描述】:

我找不到任何关于做一些真正基本的事情的参考:我想在主 UI 循环上有一个名为“forever”的方法。我会很高兴有一种方法可以调用与 UI 刷新率同步的方法,或者通过自定义时间粒度,因为我真的不需要它比每 50-100 毫秒更频繁地发生。 C++ (Carbon) 和 Objective C 的两个答案都很好,尽管我最终会在纯 C++ 应用程序中使用它。如果您还可以建议如何删除此计时器,那就太好了。

请查看 cmets 以获得关于我想使用它的线程场景的进一步说明。

类似

class MySyncedClass {
void start() {
    // start calling "execute" member function on main loop every N ms
}

void stop() {
   // stop calling "execute"
}

void execute() {
    // do something
}

};

【问题讨论】:

  • 你为什么要这样做?
  • 每次调用 execute() 时,它都会检查另一个线程的状态并触发用户提供的回调,我想确保它在主线程上以使用户代码更容易写和单线程。此外,您可以想象有其他“doSomething”方法将由 UI 用户代码触发,我想确保这些方法和 execute() 安排的内部计算都发生在同一个线程上。有意义吗?

标签: multithreading cocoa grand-central-dispatch macos-carbon runloop


【解决方案1】:

通常您在应用程序委托中的方法 didFinishLaunchingWithOptions 中执行类似的操作。当您使用 ivar 保存当前的 NSTimer 实例时,您可以随时停止它。

@implementation AppDelegate {
    NSTimer *_timer;
}

- (void) start {
    _timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(execute) userInfo:nil repeats:YES];
}

- (void) stop {
    //reset timer
    if (_timer != nil) {
        [_timer invalidate];
        _timer = nil;
    }
}

- (void) execute {
    //do something
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     [self start];
  }

但如果你只想检查另一个线程的状态,你应该通过块使用回调。

如果您想从另一个线程在主线程上执行某些操作,您可以使用 dispatch_get_main_queue:

dispatch_async(dispatch_get_main_queue(), ^{
             //do something
         });

【讨论】:

  • “通过块”是什么意思?对不起,根本不是可可专家。该库是多平台的,所以我会将这个依赖于平台的东西包装到 MySyncedClass 的成员变量中,即 MySyncedClass 将是标准 C++,它只知道它的执行方法将每 N 毫秒调用一次。
  • 在objective-c中,您可以使用闭包(块)来执行代码片段作为某种匿名函数。有关更多信息,您应该查看developer.apple.com/library/ios/#documentation/cocoa/Conceptual/… 的文档,您可以使用此块来执行回调或让调度程序在另一个线程上执行某些操作,如上面第二个 sn-p 所示。
【解决方案2】:
  1. 斯威夫特 3.0

    DispatchQueue.main.async(execute: { 
                        self._eventListTableView.reloadData()
                    })
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2016-12-19
    • 2017-10-02
    相关资源
    最近更新 更多