2014-02-20 5 views
1

서버에서 이미지를 다운로드하기위한 백그라운드 스레드를 시작하려는 iPhone 앱을 개발 중입니다. 사용자가 다운로드를 취소하고 싶으면 이미지를 다운로드하는 동안 버튼을 클릭하면 다운로드를 취소 할 수 있습니다. 백그라운드 스레드의 실행을 중지하고 싶습니다.백그라운드 스레드를 시작하고 중지하는 방법 iOS

할 수 있습니까? iPhone에서

+0

singlton 클래스 MyImageBackgrounfDownloader을 할 것입니다. –

+0

이미지 (어떤 API)를 다운로드 할 때 무엇을 사용하고 있습니까? –

+0

json을 사용하여 이미지 다운로드 – Krunal

답변

0

이 코드로 백그라운드 다운로드를 계속할 수 있습니다.

taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) { 
    }]; 

//code to download . 

[[UIApplication sharedApplication] endBackgroundTask:taskId]; 

당신은 백그라운드 작업을 중지

[[UIApplication sharedApplication] endBackgroundTask:taskId]; 

를 호출 할 수 있습니다.

그러나이 다운로드는 몇 분 동안 만 계속됩니다. 그런 다음 다운로드를 계속하면 응용 프로그램이 중단됩니다.

+0

'taskId'란 무엇입니까? – Krunal

+0

이것은 백그라운드 작업 식별자입니다. UIBackgroundTaskIdentifier taskId로 선언하십시오. – Bala

+0

쓴이 내 방법은 해고되지 않습니다'taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler :^(void) { [self downloadImage_3 : indexPath]; }], ' – Krunal

0

백그라운드에서 작업을 수행하려면 백그라운드 작업으로 래핑해야합니다. 작업이 끝나면 endBackgroundTask으로 전화하는 것이 매우 중요합니다. 그렇지 않으면 할당 된 시간이 만료 된 후 앱이 종료됩니다. 이 같은

무언가가 당신을 위해 작동합니다 :

이 속성을 선언 : 다음

@property(assign, nonatomic) UIBackgroundTaskIdentifier backgroundFetchTask; 

:

- (void) fetchImageInBackground 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    [self beginBackgroundFetchTask]; 

    NSURLResponse * response = nil; 
    NSError * error = nil; 
    NSData * responseData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; 

     // Store your image 

     [self endBackgroundFetchTask]; 
    }); 
} 

- (void) beginBackgroundFetchTask 
{ 
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [self endBackgroundFetchTask]; 
    }]; 
} 

- (void) endBackgroundFetchTask 
{ 
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask]; 
    self.backgroundFetchTask = UIBackgroundTaskInvalid; 
} 
+0

잘 작동하지만 어떻게이 스레드를 취소 할 수 있습니까? – Krunal

+0

나는 dispatch_async'이 코드를 작성 (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ [자기 beginBackgroundFetchTask] [자기 downloadImage_3 : indexPath] [자기 endBackgroundFetchTask] });'내'cellForRowAtIndexPath에서 '하지만 나는'didSelectRowAtIndexPath'에서 배경 스레드를 취소하고 있지만 내 응용 프로그램이 충돌합니다 – Krunal

+0

취소 하시겠습니까? 이미지 다운로드? 그렇다면 다운로드 방법을 변경해야하지만 백그라운드 작업은 여전히 ​​동일합니다. 'endBackgroundFetchTask'도 호출하는 것을 잊지 마십시오. –

0

당신은이 목적을 위해 AFNetworking를 사용할 수 있습니다. https://github.com/AFNetworking/AFNetworking

AFImageRequestOperation이 정확하게 수행합니다. 스레드 취소

AFImageRequestOperation * _operation = [AFImageRequestOperation imageRequestOperationWithRequest:request success:^(UIImage *image) { 
    // image is your image 
    _operation = nil; 
}]; 

[_operation start]; 

예 :

예는 이미지를 다운로드하는 경우에 따라서

[_operation cancel]; 

이 -> 변수 AFImageRequestOperation를 선언 * _operation; @interface 또는 @implementation을 사용하여 백그라운드에서 이미지를 다운로드 할 수 있습니다.

나는 당신이 다른 동작에 대한 제어를 얻을 것이다, 사용`NSOperationQueue`을 할 수 있습니다