我正在开发一个iPhone应用程序,其中,我想启动后台线程从服务器下载图像。在下载图像时,如果用户想要取消下载,然后点击按钮,他可以取消下载意味着我想停止执行后台线程。如何启动和停止后台线程iOS
有可能吗?在iPhone中
我正在开发一个iPhone应用程序,其中,我想启动后台线程从服务器下载图像。在下载图像时,如果用户想要取消下载,然后点击按钮,他可以取消下载意味着我想停止执行后台线程。如何启动和停止后台线程iOS
有可能吗?在iPhone中
您可以使用此代码开始继续后台下载。
taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
}];
//code to download .
[[UIApplication sharedApplication] endBackgroundTask:taskId];
你可以叫
[[UIApplication sharedApplication] endBackgroundTask:taskId];
停止后台任务。
但是,此下载只会持续几分钟。如果它继续下载,那么应用程序将崩溃。
如果您想在后台执行操作,那么您需要将其包装在后台任务中。当您完成时请拨打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;
}
好它的工作原理..但如何取消该线程? – Krunal
我在'dispatch_async写这个代码(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ { [自beginBackgroundFetchTask]; [自downloadImage_3:indexPath]; [自endBackgroundFetchTask]; });'在我'的cellForRowAtIndexPath '但是,我在取消'didSelectRowAtIndexPath'后台线程,但它崩溃我的应用程序 – Krunal
它是什么,你要取消?图像下载?如果是这样,您需要更改下载方法,但后台任务仍然相同。不要忘了叫'endBackgroundFetchTask'以及 –
您可以使用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
您可能需要使用'NSOperationQueue',将获得在不同的操作控制。 –
你用什么下载图像(什么api)? –
使用json下载图片 – Krunal