4

次のコードを検討してください。

最初のものでは、アニメーションを作成する関数を呼び出します。私は特定の時間間隔でそれを行います:

start:;

[self animationMethod];

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

goto start;

2番目のものでは、アニメーションを作成します

- (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);
 }

3 つ目は、すべてが正常に行われているかどうかを確認するために使用するデリゲート メソッドです。

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

    NSLog(@"ANIMATION DID START");
}

したがって、使用すると問題なく機能NSRunLoopし、デリゲート メソッドが呼び出されますが、関数で使用しようとするとsleep(3)、デリゲート メソッドが呼び出されません。

私の質問:

1) NSRunLoop と sleep() の違いを教えてください。sleep() が使用されているときにデリゲート メソッドが呼び出されないのはなぜですか?

2) より使いやすい第 3 の方法があるのではないでしょうか?

4

1 に答える 1

9

NSRunLoop は、待機中にランループがイベントに応答できるため、より優れています。スレッドをスリープ状態にするだけでは、イベントが到着してもアプリはブロックされます (待機しているネットワーク応答など)。

于 2012-03-22T09:00:52.207 に答える