1
정기적 인 간격으로 NSTimer 나 스레드를 사용하여 함수를 호출 할 수 있습니다. 두 가지 접근 방식은 본질적으로 같은 동작합니다 :일정한 간격으로 메서드를 호출하려면 어떤 방법을 사용해야합니까?
timer = [ NSTimer
scheduledTimerWithTimeInterval:1
target:self
selector:@selector(doSomething)
userInfo:nil
repeats:NO
];
및 타이머를 사용
@autoreleasepool {
BOOL continueProcessingQueue = YES;
while (continueProcessingQueue) {
[self performSelectorOnMainThread:@selector(doSomething) withObject:nil waitUntilDone:NO];
NSDate *curtainTime = [[NSDate alloc] initWithTimeIntervalSinceNow:10];
NSDate *currentTime = [[NSDate alloc] init];
while (continueProcessingQueue && ([currentTime compare:curtainTime] != NSOrderedDescending)) {
if ([self.processThread isCancelled] == YES) {
continueProcessingQueue = NO;
}
[NSThread sleepForTimeInterval:1];
currentTime = [[NSDate alloc] init];
}
}
}
훨씬 간단 보인다. 두 번째 접근법이 타이머를 사용하는 것이 더 바람직한 상황이 있습니까?
몇 가지를 이해하는 데 어려움이 있습니다. 보조 스레드로 무엇을 언급합니까? 타이머가 시작된 스레드? 지금 논의중인 예제에서 실행 루프를 폴링하면 무엇을 의미합니까? 마지막 : 어느 시나리오도 대부분의 시나리오에서 적절하지 않다고 제안합니다. 내 doSomething이 동기식 POST를 수행하고 있으며 이러한 작업을 수행 할 빈도가 1 분 정도라고 가정하면 위의 두 가지 경우 모두 좋은 접근 방법이 될 것입니다. 현재 백그라운드에서 실행되는 타이머를 허용하는 dispatch_async 문에서 타이머 접근 방식을 사용하고 있습니다. – Lolo
@ user91208 a) 위에서 제공 한 프로그램의 보조 스레드는 작업을 수행하고 주 스레드를 주기적으로 다시 호출합니다. b) 실행 루프 대기/실행. 실행 루프는 스레드의 작업이 수행되고 제어가 리턴 된 후 대기 한 다음에 일어나서 더 많은 작업을 수행합니다 (또는 종료 할 수 있음). 따라서 '투표'보다는 '달리기'가 더 나은 단어 선택입니다. 하지만 '달리다'는 "일할 때까지 유휴 상태"라는 뜻입니다. 모든 코코아 수준의 스레드에는 실행 루프가 있습니다. 실행 루프는 타이머가 연결되는 루프입니다. – justin
@ user91208 c) 설명하는 시나리오에서 NSURLConnectionDelegate를 채택하여 * 비동기 * NSURLConnection을 만듭니다. 물론 중복 작업을 피하기 위해 한 번에 하나씩 만 만들 수 있습니다. 진행/정보가 대리인에게 반환됩니다. – justin