2013-12-21 2 views
0

У меня есть NSTimer определяется как:возвращается к основному потоку от NSTimer

[NSTimer scheduledTimerWithTimeInterval:self.speed target:self selector:@selector(displayTextOverTime:) userInfo:nil repeats:YES]; 

Метод displayTextOverTime отображает некоторый текст, то сразу отображается последняя часть текста, то он аннулирует это таймер и вызывает другой метод для обработки (для отображения текста может потребоваться начало NSTimer).

Есть ли стандартный способ делать такие вещи?

Мой первоначальный подход состоял в том, чтобы просто иметь displayTextOverTime вызов другого метода напрямую, но это вызывает у меня какое-то странное поведение, когда я вложил NSTimer (который никогда не умирает, потому что хотя они недействительны и не будут зацикливаться снова, они не выполняются, потому что таймер внутри них все еще работает ... или ... что-то?), что НЕ того, что я хочу. Есть ли способ сказать: «Назовите этот метод, но сделайте это за пределами этого NSTimer», как и обратно на основной поток?

В частности, я вижу больше таймеров, которые были убиты, чем начались (у меня есть способ убить любой пройденный таймер, чтобы я мог регистрироваться, когда он убит).

+0

Существует метод 'NSObject' [' performObjectOnMainThread: withObject: waitUntilDone: '] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference .html # // apple_ref/DOC/UID/20000050-CJBEHAEF). – user1118321

+0

1. Нет смысла создавать повторяемый таймер и затем аннулировать его при каждом вызове. 2. Вы можете вызвать performSelector: afterDelay с задержкой нуля - этот метод будет работать в следующем цикле основной runloop. – EricS

+0

Для EricS я не признал ее недействительной при каждом вызове. Скорее, я говорю: «Назовите этот метод каждые X ms, пока он не сообщит вам об этом, а затем вызовите этот метод каждые X ms, пока он не сообщит вам об этом». Это отображает текст по одному слову каждый раз при простой скорости чтения, затем идет выбор другого текста (если он существует), а затем отображает его по одному слову за раз. – Jenny

ответ

3

Для получения точного ответа на ваш вопрос вы можете использовать Grand Central Dispatch для запуска функции вне вашего таймера. Вы хотите запустить функцию:

dispatch_async(dispatch_get_main_queue(), ^{ 
     (your function or block of code goes here) 
    }); 

Это будет работать за пределами вашего таймера. Вы можете сделать это в основном потоке, глобальном потоке или настраиваемом потоке с создаваемой вами очередью.

Смежные вопросы