我正在努力为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个图像并非全部加载。
请给我一些线索。
答案 0 :(得分:1)
我不知道你的ImageConverter
课程是怎样的,我想这是NSOperation
[self.pendingOperations.conversionQueue setSuspended:YES];
此调用似乎更新了单个NSOperation
的内部标志以反映已取消的状态。通常,当您恢复队列时会重置这些标志,但是您永远不会恢复队列,只需再次添加操作(可能处于取消状态)
你可以尝试两种不同的东西。
在队列上再次添加后,尝试使用setSuspended:NO
在队列上调用resume。 (我还没有尝试过)
你可以有两个操作队列而不是一个(让他们称之为普通队列和紧急队列),并摆脱conversionInProgress
个对象(我认为它是's}一个数组??),当您需要转换图像时,您暂停正常队列并使用所选图像执行紧急队列...一旦处理完毕,您将恢复正常队列。