3

使用 AFNetworking,我需要在后台下载大约 100 张图像并将它们存储到磁盘,同时确保我的应用程序中的任何其他网络连接优先。

~~~~~~~

我有一个有 4 个选项卡的应用程序。每个选项卡基本上都做同样的事情:从服务器拉下 JSON 响应,并显示图像的缩略图网格,按需拉下每个图像(使用 AF 的 ImageView 类别)。点击缩略图会将您带到详细视图控制器,您可以在其中看到更大的图像。每个选项卡的响应和图像都不同。

有一项新要求是提前获取第 4 个选项卡的所有图像,因此理论上,当用户点击第 4 个选项卡时,JSON 数据和图像正在从磁盘读取。

我现在或多或少地工作了,第 4 个选项卡预取并保存到磁盘是在后台线程上执行的,因此主线程不会锁定。但是,当用户在第一个、第二个或第三个选项卡上时启动的网络请求被预取的网络请求阻止。

我正在使用 AFNetworking,这是我在 Tab 1、2 或 3 加载时使用的代码:

// this network request ends up getting blocked by the network request that
// is fired upon the application becoming active
- (void)getAllObjectDataWithBlock:(AFCompletionBlockWrapper)block
{
    [[[MyAPIClient] sharedClient] getPath:@"" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        block(operation, responseObject, nil);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        block(operation, nil, error);
    }];
}

这是我在应用程序激活时使用的代码,用于为第 4 个选项卡预取内容:

// this network request runs in the background, but still blocks requests
// that should have a higher priority
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        NSOperationQueue *imageQueue = [[NSOperationQueue alloc] init];
        [imageQueue setMaxConcurrentOperationCount:8];

        for (NSString *imageURL in self.images) {                    
            NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL imageURL]];

            AFImageRequestOperation *operation = [[AFImageRequestOperation alloc] initWithRequest:request];
            [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
                NSLog(@"success");
            } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                NSLog(@"fail");
            }];

            [imageQueue addOperation:smallOperation];
        }
    });
}

我如何构建事物,以便从主线程启动的任何网络请求都会中断那些在后台线程中启动的网络请求?

4

1 回答 1

3

我不知道你可以很容易地中断正在运行的操作,除非你想给他们发送一个cancel-- 但你必须看看是否AFImageRequestOperation关注isCancelled.

您是否尝试过使用setQueuePriority?您可以以低优先级启动所有预取请求,然后添加具有更高优先级的当前选项卡请求。我相信正在运行的操作会完成,但是一旦它们完成,您的高优先级操作将在排队的低优先级操作之前安排。

于 2012-08-31T17:29:00.197 回答