重新排序队列时,NSOperation不执行

时间:2014-03-19 07:32:59

标签: objective-c ios7 nsoperation nsoperationqueue

我正在努力为NSOperationQueue做正确的事。 我在tableView中有两个viewController,一个tableView显示完整图片,其他tableView显示了一种图库视图。 在webView我正在加载文件并逐页显示我正在渲染Images ...以及我试图在NSOperation对象中执行的每个图像的渲染以及我要添加到Operation的这个NSOperationQueue对象。

- (void)convertPageToImage
{
    ImageDetails *imageDetails = [[ImageDetails alloc] init];
    // setting some Other required values to imageDetails    
    [self startImageConvertionForCurrentPageWithDetails:imageDetails];
}

- (void)startImageConvertionForCurrentPageWithDetails:(ImageDetails *)imageDetails
{
    if (self.pendingOperations.conversionInProgress)
    {
        // Start downloading
        ImageConverter *imageConverter = [[ImageConverter alloc] initWithImageDetails:imageDetails delegate:self];
        imageConverter.delegate = self;
        [self.pendingOperations.conversionInProgress addObject:imageConverter];
        [self.pendingOperations.conversionQueue addOperation:imageConverter];
        imageDetails = nil;
        imageConverter = nil;
    }
}

到目前为止,一切顺利,但当我从图库TableView中选择缩略图图片时,在完整视图中看到它(即再次为UITableView)并且如果该图像尚未呈现,我希望首先渲染该图像。所以我使用NSOperation对象创建新的ImageDetails并通过首先添加选定的图像NSOperationQueue重新排序Operation

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(self.currentSlide <= indexPath.row)
     {
         ImageDetails *imgDetails = [self convertSlideToImage1];
         imgDetails.currentPage = indexPath.row;
         imgDetails.showingPage = indexPath.row;
         [self performSelector:@selector(reorderOperationQueue:) withObject:imgDetails afterDelay:0.0f];
     }
}

这是我重新排序Queue

的方式
- (void)reorderOperationQueue :(ImageDetails *) imageDetails
{
    [self.webView stopLoading];
    [self.slideLoaderWebView stopLoading];
    [self.pendingOperations.conversionQueue setSuspended:YES];
    self.pendingOperations.conversionQueue = nil;
    ImageConverter *imageConverter = [[ImageConverter alloc] initWithImageDetails:imageDetails delegate:self];
    [self.pendingOperations.conversionQueue addOperation:imageConverter];
    for(ImageConverter *imgConverter in self.pendingOperations.conversionInProgress)
    {
        if(![imgConverter isEqual:imageConverter])
        {
            if(![imgConverter isFinished])
            [self.pendingOperations.conversionQueue addOperation:imgConverter];
        }
    }
    [self.webView reload];
    [self.slideLoaderWebView reload];
    [self.pendingOperations.conversionInProgress addObject:imageConverter];
    imageConverter = nil;
}

选定的图像成功转换并以完整视图显示,但在此过程中,图像应该已经处理/转换,不会被处理/转换。 迷惑???让我试试一个例子。说这个时候申请已经转换了5张图片(19张中)并且我在图库视图中选择了第16张图片而不是我创建NSOperation到第16张图片并重新排序NSOpreationQueue这样的第16张图片操作将是第一个,之后添加其余部分( NSOpreationQueue应该像第16个img,第6个img,第7个等等)。因此在结果中加载了第16个图像但第6个图像并非全部加载。 请给我一些线索。

1 个答案:

答案 0 :(得分:1)

我不知道你的ImageConverter课程是怎样的,我想这是NSOperation

的子类
[self.pendingOperations.conversionQueue setSuspended:YES];

此调用似乎更新了单个NSOperation的内部标志以反映已取消的状态。通常,当您恢复队列时会重置这些标志,但是您永远不会恢复队列,只需再次添加操作(可能处于取消状态)

你可以尝试两种不同的东西。

  1. 在队列上再次添加后,尝试使用setSuspended:NO在队列上调用resume。 (我还没有尝试过)

  2. 你可以有两个操作队列而不是一个(让他们称之为普通队列和紧急队列),并摆脱conversionInProgress个对象(我认为它是's}一个数组??),当您需要转换图像时,您暂停正常队列并使用所选图像执行紧急队列...一旦处理完毕,您将恢复正常队列。