2012-01-25 3 views
1

10 분마다 백그라운드 작업을 예약해야합니다. 이 작업은 핵심 데이터의 객체를 수집하고 웹 서비스에 정보를 업로드하여 어떤 방식으로도 변경하지 못하도록합니다.NSTimer를 사용하여 iST에서 NSThread 시작하기

내가 생각하고있는 접근 방식은 매 10 분마다 실행되는 앱 위임자에서 nstimer를 만드는 것입니다. 이것은 NSThread를 트리거하여 백그라운드에서 작업을 실행하여 사용자에게 방해가되지 않도록합니다. 스레드가 정상적으로 종료 한 후 여기로 이동합니다.

스레드를 시작하고 작업이 실행될 때마다 잠자기 모드로 설정했지만 타이머 접근 방식이 가장 깨끗한 것처럼 보였습니다.

웹상의 다른 제안은 runloops를 사용하는 것입니다. 그러나이 특별한 경우에는 사용할 수 없습니다.

누구나 제안 사항이 있거나 비슷한 상황을 어떻게 해결할 수 있는지 알려 드리고 싶습니다.

감사합니다.

답변

2

타이머는 실제로 스레드를 시작하는 올바른 방법과 비슷합니다. 그것은 백그라운드 스레드에서이 일을 실제로 필요 여부에 관해서는

- (void)startBackgroundMethod 
{ 
    //the timer calls this method runs on the main thread, so don't do any 
    //significant work here. the call below kicks off the actual background thread 
    [self performSelectorInBackground:@selector(backgroundMethod) withObject:nil]; 
} 

- (void)backgroundMethod 
{ 
    @autoreleasepool 
    { 
     //this runs in a background thread, be careful not to do any UI updates 
     //or interact with any methods that run on the main thread 
     //without wrapping them with performSelectorOnMainThread: 
    } 
} 

을 그 : 그 설정하려면 단지

[NSSTimer scheduledTimerWithTimeInterval:60.0 * 10.0 target:self selector:@selector(startBackgroundMethod) userInfo:nil repeats:YES]; 

은 다음과 같이 당신의 배경 메서드 코드를 생성 앱 위임에 넣고 그것이 무엇인지에 달려 있습니다. 쓰레드는 동시성 버그의 가능성 때문에 엄격히 요구되지 않는 한 피해야 만합니다. 그래서 스레드가 무엇을 할 것인지 알려주면 runloop 기반 접근법이 더 적합할지 여부를 조언 할 수 있습니다.

+0

안녕하세요 닉, 답변 해 주셔서 감사합니다. 기본적으로 스레드는 공유 컨텍스트를 소유하고 영구 저장소에서 개체를 검색합니다. 그런 다음 객체에서 정보를 가져 와서 웹 서비스에 업로드합니다. 어떤 방식 으로든 오브젝트를 변경하지는 않습니다. 그리고 그것은 스케줄링과 업로드 때문에 나는이 접근법을 생각하고 있습니다. ASIHTTPRequest를 사용하여 웹 서비스에 업로드하고 있습니다. – Bjarke

+0

개발자가 공식적으로 포기하고 ARC와 잘 작동하지 않기 때문에 ASI를 사용하여 다시 생각해 볼 수 있습니다. 정상적인 비동기식 NSURLConnection을 사용하여 업로드를 수행 할 수 있으며 UI를 차단하지 않고 runloop에서 실행되며 새 스레드를 생성 할 필요가 없습니다 (내부적으로 스레드를 사용한다고 가정하지만 동시성을 직접 관리 할 필요는 없습니다). –

관련 문제