2012-06-19 3 views
13

나는 서버에서 일부 데이터를 다운로드하는 응용 프로그램을 만들고 있습니다. 백그라운드에서 데이터를 다운로드 할 수 있도록 연결을 계속 실행해야합니다. 나는 방법은 응용 프로그램이 백그라운드로 전환 할 때 호출되는 AppDelegate에백그라운드에서 계속 다운로드

- (void)applicationDidEnterBackground:(UIApplication *)application 

거기 알고있다. 하지만 viewController에서 연결이 생성되면 어떻게 관리 할 수 ​​있습니까? appDelegate?
다른 방법이 있습니까/할 수 있습니까? this 링크를 통과했지만 구현하기 쉬운 것이 있습니까?

+0

, THRE는 다른 방법으로 내가이 링크를 확인해야합니다 –

+0

알고있는만큼 없습니다 http://stackoverflow.com/questions/4579810/ios-application-background-downloading – swiftBoy

답변

14

백그라운드에서 계속 작업을 수행하는 한 가지 방법은 다운로드 할 별도의 스레드를 만드는 것입니다. 스레드 내부에서 beginBackgroundTaskWithExpirationHandler : 및 endBackgroundTask에 대한 호출간에 다운로드 작업을 구분합니다. 백그라운드에서 실행 중인지 여부를 확인하지 않아도됩니다.이 두 가지 방법을 항상 호출합니다. 그것을 할 수있는 공식적인 방법은

// Tell iOS this as a background task in case we get backgrounded 
UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] 
      beginBackgroundTaskWithExpirationHandler:NULL]; 

//---------------------------------------------- 
// Perform your download operations here 
//---------------------------------------------- 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

// Tell iOS that we are done with stuff that needed to keep going even if backgrounded  
[[UIApplication sharedApplication] endBackgroundTask:taskId]; 
+1

ASIHttpRequest 특성을 설정할 수 있습니다. [request setShouldContinueWhenAppEntersBackground : YES]; – HelloWorld

+0

정말 고마워요! 내가 틀렸다면 나를 바로 잡으세요. 결론적으로 백그라운드에서 또는 전경에서 작업을 실행하는 것과 거의 차이가 없습니다. 두 가지 모두이 코드로 실행됩니다. 그러나 2 가지 차이점이 떠오른다 : 1.** ** 배경 작업이 너무 길면, 끝내기 전에 종료 될 수 있습니다! 2. 여분의 배터리를 절약 할 수 있도록'endBackgroundTask : taskId'가 더 좋습니다. – Honey

4

[편집] 죄송합니다. 주석에 지적 된 바와 같이 앱이 백그라운드로 들어가기 전에 한시적으로 작업을 수행해야하는 시간 제한을 연장 할 수 있습니다. 여기에 있습니다 Apple's Official Documentation

+0

이것은 사실이 아니므로 [Finite-Length task] (http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/)를 실행할 수 있습니다. doc/uid/TP40007072-CH4-SW28)를 백그라운드에서 최대 10 분 동안 실행하십시오. – rckoenes

+0

@rckoenes 당신이 정말로 옳습니다, 사과드립니다. 나는 내 대답을 편집 할 것이다. 아직도 정보 : – bennythemink

+0

주셔서 감사 사실이 아니다, 당신은 ['beginBackgroundTaskWithExpirationHandler를'] 호출 할 수 있습니다 (http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#를 // finance-length 작업을 실행하기 전에 // apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler :). 백그라운드로 들어가면 작업을 수행 할 필요가 없습니다. 앱을 백그라운드로 푸시하기 전에 작업을 시작할 수 있습니다. – rckoenes

1

데이터 다운로드를 정확히 처리하는 방법을 모르겠습니다. 그러나 ASIHTTPRequest을 살펴볼 수 있습니다. 매우 간단하고 직관적이며 컴파일러 플래그를 -fno-objc-arc으로 설정하면 ARC와 함께 작동합니다. 이걸로 당신은 사용해야 만합니다

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setShouldContinueWhenAppEntersBackground:YES]; //For iOS 4.0 and up 

그리고 그게 작동합니다.

Here 당신이 ASIHTTPRequest이

는 희망이 도움이 어떻게 작동하는지 볼 수 있습니다!

+0

메시지 [여기] (http://allseeing-i.com/ASIHTTPRequest/)에 따라 ASIHTTPRequest는 더 이상 개발되지 않았습니다. 그냥 말해. – zero0cool

+0

사실,하지만 여전히 매력처럼 작동합니다. ASIHTTPRequest만큼 많은 기능을 갖춘 좋은 대안을 찾지 못했습니다. – Thermometer

관련 문제