2013-06-06 33 views
0

我正在做一個教程,他們要求我在後臺加載urlimage到一個uitableview。下面是我正在使用的代碼,它的加載非常慢。有沒有使代碼加載速度更快的代碼?在後臺加載urlimage更快

NSOperationQueue * backgroundQue = [[NSOperationQueue alloc] init];

int websiteNumber=0; 

for (NSString* website in websites){ 

    [backgroundQue addOperationWithBlock:^{ 
     NSURL* iconURL=[NSURL URLWithString: 

     [NSString stringWithFormat:@"http://%@/favicon.ico", website]]; 

     NSURLRequest*request=[NSURLRequest requestWithURL:iconURL]; 

     NSData* loadData = [NSURLConnection 
          sendSynchronousRequest:request returningResponse:nil error:nil]; 

     if(loadData !=nil){ 
      UIImage* loadImage= [UIImage imageWithData:loadData]; 

      if(loadImage ==nil){ 
       return ; 
      } 

      [[NSOperationQueue mainQueue]addOperationWithBlock:^{ 
       [websiteIcons replaceObjectAtIndex:websiteNumber withObject:loadImage]; 

       [self.tableView reloadData]; 

      }]; 
     } 
    }]; 
    websiteNumber++; 

} 

回答

0

是的。與NSURLConnection一起使用異步樣式。即,實現委託方法。

因爲它似乎還需要發送一大堆的請求,這也可能是最好封裝連接和所有相關數據,如響應數據爲一類,其職責是執行一個請求。

如果您將此類別設置爲NSOperation的子類別,則可以使用NSOperationQueue來控制同時處於活動狀態的連接數量。

但是,實施正確和可靠的連接類別可能是一項具有挑戰性的任務。因此,您可能會尋找第三方庫。還要看看Apple提供的網絡示例,尤其是QHTTPOperation

還有很多要說的,以使這個快速和可靠。但是我會建議從一個繼承自NSObject的類的實現開始 - 比如HTTPRequestOperation - 它實現了兩個NSURLConnection委託協議。有一個開始,取消,已完成,isCancelled和isExecuting屬性/方法和完成塊(可能是一個屬性),將在連接完成時調用,已被取消或失敗。它看起來像一個NSOperation子類 - 但這不是必需的。您可以稍後在需要時輕鬆將其作爲NSOperation的子類。

完成塊傳遞一個參數結果id類型的 - 其或者是響應的體數據或NSError對象的情況下,連接失敗。 cancel方法必須是線程安全的 - 因爲這可以從任何線程調用。

首先,連接委託方法應安排在主線程上。後來你可能使用專用線程 - 或NSOperationQueue

我有一個簡單的例子實現這個,它有170行代碼和20行的標題。只是想給你一個想法。 ;)