1

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

请查看评论以进一步解释我想使用它的线程场景。

就像是

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

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

void execute() {
    // do something
}

};
4

2 回答 2

2

通常您在应用程序委托中的方法 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
         });
于 2013-05-27T16:19:50.557 回答
1
  1. 斯威夫特 3.0

    DispatchQueue.main.async(execute: { 
                        self._eventListTableView.reloadData()
                    })
    
于 2016-09-22T09:51:45.630 回答