2013-06-06 3 views
0

Я делаю учебник, где они просят меня загрузить увлажнение в фоновом режиме в 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. Запуск, отмена, isFinished, isCancelled и isExecuting property/method, а также блок завершения (возможно, свойство), который будет вызываться при завершении соединения, был отменен или не выполнен. Это похоже на подкласс NSOperation - но это не требуется. Вы можете позже сделать его подклассом NSOperation, когда это необходимо, легко.

Блок завершения передает параметр результата типа id - который является либо данные телом ответа или NSError объекта в случае, если соединение не удалось. Метод cancel должен быть потокобезопасным - так как это может быть вызвано из любой нити.

Для начала методы делегирования соединения должны быть запланированы в основном потоке. Позже вы можете использовать, используя выделенный поток - или NSOperationQueue.

У меня есть упрощенный пример реализации этого, который имеет 170 строк кода и заголовок с 20 строками. Просто чтобы дать вам представление. ;)

Смежные вопросы