Разница в использовании функций sleep () и [[NSRunLoop currentRunLoop] runUntilDate] - PullRequest
3 голосов
/ 22 марта 2012

Пожалуйста, рассмотрите следующие фрагменты кода:

В первом я вызываю функцию, которая создает анимацию.я делаю это с определенным интервалом времени:

start:;

[self animationMethod];

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
//sleep(3);

goto start;

Во втором я создаю анимацию

- (void)animationMethod
 {
  CAKeyframeAnimation *myAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CGMutablePathRef curvedPath             = CGPathCreateMutable();

CGPathMoveToPoint(curvedPath, NULL, start.x, start.y);
CGPathAddCurveToPoint(curvedPath, NULL, fcp.x, fcp.y, scp.x , scp.y, end.x, end.y); 

myAnimation.path                = curvedPath;
myAnimation.duration            = flight_duration;
myAnimation.removedOnCompletion = NO;
myAnimation.delegate            = self;  
myAnimation.fillMode            = kCAFillModeForwards;

[myAnimation setValue:identifier forKey:@"id"];

[flyingBug addAnimation:myAnimation forKey:@"bug_flight"];

CGPathRelease(curvedPath);
 }

, а третий - метод делегата, который я использую, чтобы проверить всепроисходит нормально:

- (void)animationDidStart:(CAAnimation *)anim
{

    NSLog(@"ANIMATION DID START");
}

Так что, когда я использую NSRunLoop, все работает нормально, вызывается метод делегата, но если я пытаюсь использовать функцию sleep(3), метод делегата не получаетназывается.

Мои вопросы:

1) Не могли бы вы объяснить разницу между NSRunLoop и sleep ()?Почему метод делегата не вызывается при использовании sleep ()?

2) Может быть, существует третий возможный метод, который лучше в использовании?

1 Ответ

8 голосов
/ 22 марта 2012

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

...