AFNetworking:中断后台请求更高优先级的请求

时间:2012-08-29 23:57:29

标签: objective-c ios5 grand-central-dispatch nsoperationqueue afnetworking

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

~~~~~~~

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

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

我现在或多或少地正常工作,第4个标签预取并保存到后台线程上的磁盘,因此主线程无法锁定。但是,当用户在第一,第二或第三个选项卡上被预取网络请求阻止时,网络请求被踢开。

我正在使用AFNetworking,这是我在使用标签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];
        }
    });
}

如何构建内容,以便从主线程启动的任何网络请求中断那些在后台线程中启动的请求?

1 个答案:

答案 0 :(得分:3)

我不知道你可以轻易地中断正在运行的操作,除非你想发送cancel - 但是你必须看看AFImageRequestOperation是否注意{{1} }}

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