2013-05-06 49 views
0

我想構建一個很好的函數來訪問圖像的網絡,如果它們在網上找到,我將它們存儲在我製作的緩存系統中。 如果圖像已經存儲在緩存中,我將它返回。 該功能被稱爲getImageFromCache,並返回一個圖像,如果它在緩存中,否則它會去網絡並獲取。UIImages NSURLs和線程

的代碼可能是這樣的:

UIImageView* backgroundTiles = [[UIImageView alloc] initWithImage[self getImageFromCache:@"http://www.example.com/1.jpg"]]; 

現在,我在繼續使用,因爲由於網絡流量大的延遲的線程。所以我希望圖像在我得到網絡結果之前顯示一個臨時圖像。

我想知道的是,如何跟蹤順序訪問的很多圖像,通過此函數(getImageFromCache)將其添加到UIImageView

東西就不會在那裏工作:

-(UIImage*)getImageFromCache:(NSString*)forURL{ 

    __block NSError* error = nil; 
    __block NSData *imageData; 
    __block UIImage* tmpImage; 

    if(forURL==nil) return nil; 

    if(![self.imagesCache objectForKey:forURL]) 
    { 
     // Setting a temporary image until we start getting results 
     tmpImage = [UIImage imageNamed:@"noimage.png"]; 

     NSURL *imageURL = [NSURL URLWithString:forURL]; 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
      imageData = [NSData dataWithContentsOfURL:imageURL options:NSDataReadingUncached error:&error]; 
      if(imageData) 
      { 
       NSLog(@"Thread fetching image URL:%@",imageURL); 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        tmpImage = [UIImage imageWithData:imageData]; 
        if(tmpImage) 
        { 
         [imagesCache setObject:tmpImage forKey:forURL]; 
        } 
        else 
         // Couldn't build an image of this data, probably bad URL 
         [imagesCache setObject:[UIImage imageNamed:@"imageNotFound.png"] forKey:forURL]; 
        }); 
      } 
      else 
       // Couldn't build an image of this data, probably bad URL 
       [imagesCache setObject:[UIImage imageNamed:@"imageNotFound.png"] forKey:forURL]; 

     }); 

    } 
    else 
     return [imagesCache objectForKey:forURL]; 

    return tmpImage; 
} 
+0

什麼是實際問題? – matt 2013-05-06 17:28:42

+0

我不知道如何管理圖像一旦他們從網絡上返回 – Ted 2013-05-06 18:03:34

+0

您的代碼顯示您將圖像放在字典中。這是管理他們。我再次問,問題是什麼? – matt 2013-05-06 21:13:33

回答

1

這不是直接回答你的問題,但你知道,有沒有必要使用GCD下載東西異步(在後臺線程)?只需使用NSURLConnection及其委託方法即可。您的所有代碼都將在主線程中,但實際的連接和下載將在後臺進行。

(事實上,我寫了一個類,MyDownloader,這需要照顧的這一切對你:

http://www.apeth.com/iOSBook/ch37.html#_http_requests

向下滾動到約MyDownloader和它的子類MyImageDownloader的一部分,這是做正確的你需要在這裏完成的事情。此外,請注意該章節中的後續代碼,顯示如何在下載完成時使用通知,提示需要這些圖像的表視圖重新加載包含圖像視圖的行的圖像剛剛到達)。

0

在後臺線程中,一旦下載完成並將圖像保存到緩存中,我建議您使用NSNotificationCenter發佈通知,讓應用程序的其他部分知道緩存已更新。

這裏假設應用程序的哪個部分管理圖像視圖已經在使用addObserverForName方法的通知中註冊了它的興趣。當它收到這樣的通知時,它可以嘗試再次從緩存中檢索圖像,並在適當的時候更新其圖像視圖。

根據圖像視圖的數量,您可能希望以某種方式(例如在userInfo字典中)通過通知中的圖像url,然後基於此決定應刷新哪些圖像視圖而不是刷新商場。

我應該補充一點,我也建議擺脫內部dispatch_async調用。儘管您可能需要將同步添加到緩存對象,以便可以從主線程和下載線程安全地訪問它,但並不需要這樣做。

1

其良好的構​​建它從頭開始,但如果你想保存所有的工作,有一個下降更換SDWebImage圖書館支持來自網絡的遠程圖像,並具有所有的功能像Temp Image,Asychronous Loading ,緩存等,你說你需要