2013-02-21 3 views
0

Я использую CADisplayLink как таймер для стробирования.Запуск нескольких CADisplayLinks за раз?

У меня 2 CADisplayLinks:

основным (это работает в течение всего этого):

SMPTELink = [CADisplayLink displayLinkWithTarget:self selector:@selector(onTick)]; 
SMPTELink.frameInterval = 1; 
[SMPTELink addToRunLoop:[NSRunLoop mainRunLoop] 
         forMode:NSDefaultRunLoopMode]; 

Строб один (это только работает, когда стробирование происходит):

strobeLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(toggleStrobe)]; 
strobeLink.frameInterval = 1; 
[strobeLink addToRunLoop:[NSRunLoop mainRunLoop] 
        forMode:NSDefaultRunLoopMode]; 
[strobeLink setPaused:YES]; // I setPaused:NO when using the strobe. 

Неправильно ли запускать сразу два CADisplayLinks? Иногда мой строб выглядит не так гладко, как мне кажется. Вот мой метод toggleStrobe:

-(void)toggleStrobe { 

    if (!self.firstTimestampStrobe) 
     self.firstTimestampStrobe = strobeLink.timestamp; 

    NSTimeInterval elapsed = (strobeLink.timestamp - self.firstTimestampStrobe); 

    NSInteger frameNumber = (NSInteger)(elapsed * ((strobeValue*15)/255)) % 2; 

    if (frameNumber != self.lastFrameStrobe) 
    { 
     if (frameNumber == 1) { 

      UIColor *color = [[UIColor alloc] initWithRed: 0 green: 0 blue: 0 alpha: 1.0]; 
      strobeBackground.backgroundColor = color; 

     } else { 

      UIColor *color = [[UIColor alloc] initWithRed: 0 green: 0 blue: 0 alpha: 0]; 
      strobeBackground.backgroundColor = color; 

     } 

     self.lastFrameStrobe = frameNumber; 
    } 

} 

ответ

2

Точка ссылки дисплея, чтобы иметь возможность рисовать с каждым обновлением экрана. Я не понимаю, почему вам понадобится два (так как он все равно будет вызван, когда дисплей обновится). Не можете ли вы просто использовать один и с каждым обновлением определить, какой цвет отображать?

+0

Выяснил способ работы в одном CADisplayLink - отлично работает! – objectiveccoder001

+0

С точки зрения API имеет смысл не увеличивать сложность, проверяя, существуют ли другие или нет. – hfossli

0

Его неплохо .. его просто бессмысленно.

Зачем вам два? Цель CADisplayLink - запустить метод с каждым обновлением дисплея. Если вы хотите, чтобы две разные вещи происходили с двумя разными скоростями, тогда на экранной линии запускается один метод refreshView: или что-то в этом направлении. Затем в этом методе сделайте свою собственную логику, чтобы определить, нужно ли ее время переключать строб.

+0

С точки зрения API имеет смысл не увеличивать сложность, проверяя, существуют ли другие или нет. – hfossli

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