2014-03-19 67 views
1

我很努力地爲NSOperationQueue獲取正確的東西。 我有兩個tableViewviewController,一個tableView顯示完整的圖像和其他tableView顯示一種畫廊視圖。 在我webView我正在加載文件,並逐頁我正在呈現Images出來..每個圖像我試圖做在NSOperation對象和這個Operation對象我正在添加到NSOperationQueue重新排列隊列時,NSOperation不會執行

- (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),如果該圖像尚未呈現,我想這種形象所以我創建新的NSOperationImageDetails對象和重新排序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

我不知道你的ImageConverter類的樣子,我想這是NSOperation

[self.pendingOperations.conversionQueue setSuspended:YES]; 

一個子類,這個調用似乎更新個人NSOperation內部標誌,以反映取消狀態。通常,當您恢復隊列時,這些標誌會重置,但是您不會恢復隊列,只需再次添加操作(可能處於取消狀態)。

您可以嘗試兩種不同的操作。

  1. 嘗試調用使用setSuspended:NO隊列簡歷再次在隊列中添加後他們。 (我還沒試過)

  2. 你可以有兩個操作隊列而不是一個(我們稱之爲普通隊列和緊急隊列),然後擺脫conversionInProgress對象(我認爲它是一個數組??) ,並且當您需要轉換圖像時,您會掛起普通隊列,並使用所選圖像執行緊急隊列......一旦處理完畢,您將恢復正常隊列。

+0

你是對的ImageConverter是NSOperation的子類,它只是主要的方法實現和一些圖像渲染方法的實現。 就你的第一個建議而言,我並不是都在使用舊隊列。爲舊隊列分配nil並創建一個新隊列。所以我想不需要將Suspended設置爲YES。我真的很喜歡你的第二點,我會這樣。搭售後讓你知道。非常感謝您的快速回復。 – Suryakant

+0

@SuryakantSharma我知道你沒有使用舊的隊列,但是你正在重新使用這些操作,即使你指定了nil,這些操作也會保留在具有掛起狀態的'conversionInProgress'中。因此,當你再次將它們添加到隊列中時,它們可能仍會被暫停。 – Merlevede

+0

暫停狀態是爲隊列不操作。 – Suryakant