2014-02-20 78 views
1

我正在开发一个iPhone应用程序,其中,我想启动后台线程从服务器下载图像。在下载图像时,如果用户想要取消下载,然后点击按钮,他可以取消下载意味着我想停止执行后台线程。如何启动和停止后台线程iOS

有可能吗?在iPhone中

+0

您可能需要使用'NSOperationQueue',将获得在不同的操作控制。 –

+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中,并使用它在后台下载图像。

我会做一个singlton类MyImageBackgrounfDownloader