2013-05-14 59 views
0

我有一個壁紙應用程序,它在主視圖上具有分頁滾動視圖。滾動視圖的每個頁面顯示9個圖像。 當視圖滾動時,我正在加載下面的10頁圖像,並將之前10頁的圖像加載到nil以防止內存警告。iOS即使在使用調度時也會延遲

問題是當視圖滾動,所以調用下面的scrollview方法時,即使我已經將dispatch_async中加載新圖像的塊代碼放在視圖可以滾動之前幾秒鐘延遲。 當我用調度的東西評論整個代碼段時,沒有任何延遲。

如果有人對此有何想法。請讓我知道。

謝謝大家這麼多

- (void)scrollViewDidScroll:(UIScrollView *)scrollV 
{ 
float fractionalPage = scrollView.contentOffset.x/self.view.frame.size.width; 

if (curPageNum != lround(fractionalPage)) { 

    curPageNum = lround(fractionalPage);   

    //display the page number 
    pageNumLabel.text = [NSString stringWithFormat:@"%d",curPageNum+1]; 
    pageNumLabel.alpha = 1.0; 
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(dismissPageNum) userInfo:nil repeats:NO]; 


    //loading more pages with 9 image in each 
    lastLoadedPageNum = MIN(lastLoadedPageNum + 10, numPages - 1); 

    dispatch_queue_t getImages = dispatch_queue_create("Getting Images", nil); 
    dispatch_async(getImages, ^{ 

     for (int i = curPageNum + 4 ; i <= lastLoadedPageNum ; i++) { 

      int numPicsPerPage = 9; 
      if (picsNames.count%9 && i == numPages-1) { 

       numPicsPerPage = picsNames.count%9; 
      } 

      for (int j = 0 ; j < numPicsPerPage ; j++) { 

       UIImage *image = [brain imageWith:[picsNames objectAtIndex:(i*9) + j]]; 

       dispatch_async(dispatch_get_main_queue(), ^{ 

        //loading the image to imageview 
        UIImageView *imageView = (UIImageView *)[scrollView viewWithTag:IMAGE_VIEWS_TAG + (i*9) + j]; 
        imageView.image = image; 
       }); 
      } 
     } 
    }); 

    //setting old imageview images to nil to release memory 
    int oldFirstLoadedPageNum = firtLoadedPageNum; 
    firtLoadedPageNum = MAX(curPageNum - 4, 0); 
    for (int i = oldFirstLoadedPageNum ; i < firtLoadedPageNum ; i++) { 

     int numPicsPerPage = 9; 
     if (picsNames.count%9 && i == numPages-1) { 

      numPicsPerPage = picsNames.count%9; 
     } 

     for (int j = 0 ; j < numPicsPerPage ; j++) { 

      UIImageView *imageView = (UIImageView *)[scrollView viewWithTag:IMAGE_VIEWS_TAG + (i*9) + j]; 
      imageView.image = nil; 
      [((UIActivityIndicatorView *)[imageView viewWithTag:ACTIVITY_INDICATOR_TAG]) startAnimating]; 
     }    
    } 
} 
} 

腦方法imageWith:

-(UIImage *)imageWith:(NSString *)imageName 
{ 
NSString *imagePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:imageName]; 
UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; 

if (!image && [self connected]) { 

    image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", picsURL, imageName]]]]; 

    if (image) { 

     [UIImagePNGRepresentation(image) writeToFile:imagePath atomically:YES]; 
    } 

} 

return image; 
} 
+0

'[brain imageWith'方法是什麼? – danypata

+0

我已經添加了imageWith方法 – Mona

+1

您是否嘗試過使用'dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0)'而不是'dispatch_queue_create(「獲取圖像」,無)'? –

回答

0

至於建議由麥克·波拉德我用

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0) 

,而不是

dispatch_queue_create("Getting Images", nil) 

,並解決了問題。

謝謝大家。

0

最有可能與嵌套for循環塊後,你的邏輯造成的延遲。將其移出一個單獨的方法並在單獨的線程中運行。

+0

即使我註釋掉該部分,我仍然有延遲 – Mona

+0

您的塊的結尾位於for循環內 - 您是否意味着在dispatch_async中有該循環? – savner

+0

沒有。在獲取每個圖像後,在for循環內部,我將它分配給主隊列 – Mona

1

顯然,您的代碼正在循環,導致延遲。我認爲,因爲dispatch在for循環內部,所以只有經過一定次數的迭代後纔會調用它,以便在此處使用多線程時沒有真正的增益。

+0

內的imageview,主調度位於for循環之外。並且延遲是由於下載過程而不是顯示進程造成的 – Mona

相關問題