문제

메소드 호출을 반복하려면 (또는 메시지 보내기, 적절한 용어는마다) 엑스 순간, NSTIMER (NSTIMER의 ScheduledTimerWithTimeInterval : Target : Selector : userInfo : Returs :) 또는 방법이 끝에서 재귀 적으로 호출되도록하는 것이 더 좋습니다 (PerformStector : WithObject : AfterDelay)? 후자는 물체를 사용하지 않지만 덜 명확하거나 읽기 쉬운 것일까 요? 또한, 내가하고있는 일에 대한 아이디어를주기 위해, 자정 12:00까지 계산되는 레이블이있는 견해 일뿐입니다. 그리고 영원히 경고음 소리를냅니다.

감사.

편집 : 또한 SystemsoundID (Forever)를 반복적으로 재생하는 가장 좋은 방법은 무엇입니까? 편집 : 나는 이것을 사용하여 SystemsoundId를 영원히 연주했습니다.

// Utilities.h
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioServices.h>


static void soundCompleted(SystemSoundID soundID, void *myself);

@interface Utilities : NSObject {

}

+ (SystemSoundID)createSystemSoundIDFromFile:(NSString *)fileName ofType:(NSString *)type;
+ (void)playAndRepeatSystemSoundID:(SystemSoundID)soundID;
+ (void)stopPlayingAndDisposeSystemSoundID;

@end


// Utilities.m
#import "Utilities.h"


static BOOL play;

static void soundCompleted(SystemSoundID soundID, void *interval) {
    if(play) {
        [NSThread sleepForTimeInterval:(NSTimeInterval)interval];
        AudioServicesPlaySystemSound(soundID);
    } else {
        AudioServicesRemoveSystemSoundCompletion(soundID);
        AudioServicesDisposeSystemSoundID(soundID);
    }

}

@implementation Utilities

+ (SystemSoundID)createSystemSoundIDFromFile:(NSString *)fileName ofType:(NSString *)type {
    NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:type];
    SystemSoundID soundID;

    NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];

    AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
    return soundID;
}

+ (void)playAndRepeatSystemSoundID:(SystemSoundID)soundID interval:(NSTimeInterval)interval {
    play = YES
    AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL,
                                          soundCompleted, (void *)interval);
    AudioServicesPlaySystemSound(soundID);
}

+ (void)stopPlayingAndDisposeSystemSoundID {
    play = NO
}

@end

잘 작동하는 것 같습니다.

도움이 되었습니까?

해결책

타이머는 엄격하게 정의 된 간격에 더 적합합니다. 기능 호출이 지연된 상태에서 자체적으로 호출되면 정확도를 잃게됩니다. 동기화 시간 간격으로. 실제 방법 자체를 실행하는 데 걸리는 시간이 항상 있습니다.

NSTIMER를 고수하고 싶습니다.

다른 팁

다른 답변에 약간의 추가를 추가하기 위해, 재귀적인 호출의 사례는 통화에 알 수없는 시간이 걸릴 때입니다. 완료 될 때까지 소량의 데이터로 웹 서비스를 반복적으로 호출한다고 말합니다. 각 통화에는 알려지지 않은 시간이 걸릴 수 있으므로 웹 통화가 반환 될 때까지 코드가 아무것도하지 않아도됩니다. 그러면 더 이상 데이터를 보내지 않고 코드가 다시 호출되지 않을 때까지 다음 배치가 전송됩니다.

응용 프로그램은 시간 정확도 (예 : 초당 1 회 실행해야 함)에 의존하기 때문에 NSTIMER가 더 좋습니다. 메소드 자체가 실행하는 데 약간의 시간이 걸리고, NSTIMER는 그와 함께 괜찮습니다 (매 초라고 불리는 경우 메소드가 1 초 미만이 걸리는 한).

반복적으로 사운드를 재생하려면 완성 콜백을 설정하고 그곳에서 사운드를 재생할 수 있습니다.

SystemSoundID tickingSound;

...

AudioServicesAddSystemSoundCompletion(tickingSound, NULL, NULL, completionCallback, (void*) self);

...

static void completionCallback(SystemSoundID mySSID, void* myself) {
  NSLog(@"completionCallback");

  // You can use this when/if you want to remove the completion callback
  //AudioServicesRemoveSystemSoundCompletion(mySSID);

  // myself is the object that called set the callback, because we set it up that way above
  // Cast it to whatever object that is (e.g. MyViewController, in this case)
  [(MyViewController *)myself playSound:mySSID];
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top