我正在开发一个iPhone应用程序,其中,我想启动后台线程从服务器下载图像。当用户想要取消下载时下载图像,然后点击按钮他可以取消下载意味着我想停止执行后台线程。
有可能吗?在iPhone
答案 0 :(得分:0)
您可以使用此代码开始继续后台下载。
taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
}];
//code to download .
[[UIApplication sharedApplication] endBackgroundTask:taskId];
你可以打电话
[[UIApplication sharedApplication] endBackgroundTask:taskId];
停止后台任务。
但是这次下载只会持续几分钟。如果继续下载,应用程序将崩溃。
答案 1 :(得分: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;
}
答案 2 :(得分: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中使用它在后台下载你的图像。
我会做一个单一类MyImageBackgrounfDownloader