0

私はviewDidLoadで2つのメソッドを実行しており、それらの間で10秒間NSRunLoopを実行しています

-(void)nextImage{ //charging a random image in the image view

    index = [[NSArray alloc]initWithObjects:@"1.jpg",@"2.jpg",@"3.jpg",@"4.jpg",@"5.jpg",nil];
    NSUInteger randomIndex = arc4random() % [index count];
    NSString *imageName = [index objectAtIndex:randomIndex];
    NSLog(@"%@",imageName);
    self.banner=[UIImage imageNamed:imageName];
    self.imageView.image=banner;
    [imageName release];
}

-(void)horror{

    self.banner=[UIImage imageNamed:@"Flo.jpg"];
    self.imageView.image=banner;
    NSString *path = [NSString stringWithFormat:@"%@%@",[[NSBundle mainBundle] resourcePath],@"/scream.wav"];
    SystemSoundID soundID;
    NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
    AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
    AudioServicesPlaySystemSound(soundID);

}

- (void)viewDidLoad
{

    [self nextImage];

    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10.0]];

    [self horror];

    [super viewDidLoad];
}

ここで画像は変化せず、黒い画面になり、10 秒後には [恐怖] の結果しか表示されません。反対に、viewDidLoad に [nextImage] のみを保持すると、画像が変更され、NSRunLoop で何か問題が発生していると思います

4

1 に答える 1

1

ほとんどの場合、実行ループを直接操作しないでください。メソッドrunUntilDate:はそうではありません。ユースケースでは、タイマーを設定する必要があります。

- (void)viewDidLoad
{
    [self nextImage];
    [NSTimer scheduledTimerWithTimeInterval: 10.0 target: self selector: @selector(horror) userInfo: nil repeats: NO];
    [super viewDidLoad];
}

タイマーは 10 秒後に起動し ( timeInterval: 10.0)、ターゲット オブジェクト (この場合はビュー コントローラーtarget: self) にメソッドを実行させますhorror( によりselector: @selector(horror))。

時間が経過する前に View Controller が非アクティブになる可能性がある場合は、タイマー インスタンスを ivar で保護し、キャンセルします。

...
NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval: 10.0 target: self selector: @selector(horror) userInfo: nil repeats: NO];
self.myTimerProperty = timer;
...

キャンセルする必要がある場合:

...
if (self.myTimerProperty)
{
    // Ok. Since we have a timer here, we must assume, that we have set it
    // up but it did not fire until now. So, cancel it 
    [self.myTimerProperty invalidate];
    self.myTimerProperty = nil;
}
...

ところで、これを行っている場合は、コールバック メソッド内からタイマー プロパティをクリアすることをお勧めします。

- (void) horror
{
    self.myTimerProperty = nil;
    ... other horrible stuff ...
}
于 2011-12-27T09:51:19.723 に答える