2015-06-04 2 views
1

У меня есть секундомер, который периодически обновляет представление в своем методе tick. Метод запускается черезperformSelectorAfterDelay ненадежный на Apple Watch

[self performSelector:@selector(tick) withObject:self afterDelay:0.1f]; 

Это прекрасно работает на iPhone, где изображение обновляется приблизительно. каждую десятую секунды.

Теперь я хочу использовать тот же класс для достижения этого на Apple Watch. Когда я запускаю секундомер, представление получает обновленный вид OK. Однако через 2 секунды частота кадров падает, и секундомер становится непригодным.

Здесь весь tick метод:

- (void)tick { 
if (!self.running) return; 
NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate]; 
NSTimeInterval elapsed = currentTime - startTime; 
if (countdown) { 
    curTime = originalTime - (elapsed * 1000); 
}else { 
    curTime = originalTime + (elapsed * 1000); 
    curTime -= offset; 
} 

[self.delegate stopwatch:self tick:curTime]; 
long thisThousand = curTime/1000; 

if (curTime > 0 || !countdown) { 
    if (thisThousand != lastThousand) { 
     long seconds = curTime/1000; 
     if (countdown) seconds++; 
     [self.delegate stopwatch:self fullSecond:seconds]; 
    } 
    lastThousand = curTime/1000; 
    [self performSelector:@selector(tick) withObject:self afterDelay:0.1f]; 
} else { 
    curTime = 0; 
    [self.delegate stopwatch:self fullSecond:0]; 
    [self.delegate stopwatchStoped:self]; 
    [self stopTimer]; 
} 
} 

Любые идеи о том, как получить, чтобы работать. Или альтернативное решение?

Большое спасибо!

EDIT: Пользовательский интерфейс - это простая метка, а не причудливая анимация. Метка должна быть установлена ​​только с 0: 00: 00.1 до 0: 00: 00.2 и т. Д.

ответ

-1

Если вы обновляете представления этого метода (я предполагаю, что [self.delegate stopwatch:self fullSecond:seconds] обновляет представление?) Если ДА, то вы должны посмотреть на CoreAnimation. Анимации намного лучше разработаны для обработки изменений вида с течением времени (ведь это анимация!). Если вы анимируете вторую руку, вы можете создать анимацию, которая делает ее «тиканием» и просто повторяет процесс на неопределенный срок. Существуют также методы делегатов, которые информируют вас о завершении анимации, которую вы можете использовать для любых других вычислений.

Look here для документов по CoreAnimation.

Альтернативой performSelector:afterDelay: будет использовать NSTimer:

// timer is an iVar 
timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(tick) userInfo:nil repeats:YES]; 

// then to stop the timer 
[timer invalidate]; 

Я хотел бы предложить CoreAnimation первым.

+0

Стоит отметить, что Core Animation недоступна в WatchKit, в настоящее время. – bgilham

+0

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