0

Я не могу найти ссылку на выполнение чего-то, что должно быть действительно базовым: я хотел бы иметь метод, называемый «вечно» в основном цикле интерфейса. Я был бы счастлив как с возможностью вызова моего метода, синхронизированного с частотой обновления пользовательского интерфейса, либо путем передачи пользовательской временной гранулярности, поскольку мне не нужно, чтобы это происходило чаще, чем каждые 50-100 мс. Оба ответа для C++ (Carbon) и Objective C прекрасны, хотя я в конечном итоге буду использовать его в чистом приложении C++. Если бы вы могли предложить также, как удалить этот таймер, было бы здорово.Запуск цикла в основной теме в osx и ios

Пожалуйста, проверьте комментарии для дальнейшего объяснения сценария потоков, где я хочу использовать это.

что-то вроде

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

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

void execute() { 
    // do something 
} 

}; 
+0

почему ты сделал это? – peko

+0

каждый раз, когда вызывается execute(), он проверяет состояние другого потока и запускает запрошенный пользователем обратный вызов, который я хочу убедиться, что он находится в основном потоке, чтобы сделать код пользователя более простым для записи и однопоточным. Кроме того, вы можете представить себе другие методы doSomething, которые будут инициироваться пользовательским кодом пользовательского интерфейса, и я хочу убедиться, что оба этих метода и внутренние вычисления, запланированные execute(), происходят в одном потоке. имеет смысл? –

ответ

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 
     }); 
+0

Что значит «через блок»? извините, не эксперт по какао вообще. Библиотека является многоплатформенной, поэтому я переношу эту зависимую от платформы информацию в переменную-член MySyncedClass, то есть MySyncedClass будет std C++, которая просто знает, что метод execute будет вызываться каждый N ms. –

+1

в объективе-c вы можете использовать блокировки (блоки) для выполнения фрагментов кода как своего рода анонимных функций. Для получения дополнительной информации вы должны посмотреть документацию по адресу http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7 -SW1, вы можете использовать эти блоки для выполнения обратных вызовов или позволить диспетчеру выполнить что-то в другом потоке, как вы можете видеть во втором фрагменте выше. – Herm

0
  1. Swift 3,0

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