如何启动和停止后台线程iOS

时间:2014-02-20 12:32:23

标签: ios iphone multithreading ipad nsthread

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

有可能吗?在iPhone

3 个答案:

答案 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