В настоящее время я работаю с библиотекой Three20 , чтобы реализовать некоторое кэширование для проекта iPhone. Это очень помогло ускорить просмотр таблиц и загрузку страниц, однако я столкнулся с небольшой проблемой:
У меня есть подклассы TTURLImageResponse
для изменения размера / обрезки изображений, которые извлекаются удаленно перед их кэшированием, чтобы мне не приходилось изменять их размер каждый раз, когда я получаю их обратно с сервера / кеша. Это работает очень хорошо, и изображения загружаются довольно быстро, однако, когда изображения возвращаются из кэша в библиотеке Three20, они возвращаются синхронно. Это приводит к заметной задержке при запуске 10-20 запросов изображений, которые возвращаются из кэша. Поскольку они возвращаются синхронно, они блокируют мой поток пользовательского интерфейса, и пользователь остается ждать пару секунд, прежде чем он увидит изображения, которые вернулись из кэша.
Я попытался выполнить операцию, выполнив следующее:
- (void) setupImages
{
if(imageList != nil &&
[imageList count] > 0)
{
[NSThread detachNewThreadSelector:@selector(fillImages) toTarget:self withObject:nil];
}
else
{
lblMessage.hidden = NO;
lblMessage.text = @"There are no images. Try refreshing the current list.";
lblTitle.text = @"";
lblAuthor.text = @"";
}
}
- (void)fillImages
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int i=0;
TTURLRequest *request;
for (MyImage *imageObj in imageList)
{
NSString *imageUrl = [[[imageObj thumbnail_lg] image_url] absoluteString];
if(imageUrl != nil)
{
request = [TTURLRequest requestWithURL:imageUrl delegate:self];
MyTTURLImageResponse *responseObj = [[[MyTTURLImageResponse alloc] init] autorelease];
responseObj.index = i;
request.cachePolicy = TTURLRequestCachePolicyDisk;
request.response = responseObj;
request.httpMethod = @"GET";
[request send];
i++;
}
}
[pool release];
}
//When the fillImages selector is spawned on its own thread it does not callback to this method, therefore images are never loaded!!
- (void)requestDidFinishLoad:(TTURLRequest*)request
{
MyTTURLImageResponse *response = request.response;
UIImage *loadedImage = response.image;
int imageIndex = response.index;
//this now happens as the image is cached :)
//loadedImage = [loadedImage cropCenterAndScaleImageToSize:CGSizeMake(200, 200)];
[myImageDisplay setImage:loadedImage forIndex:imageIndex];
}
Однако поток не работает (обратный вызов находится в главном потоке ...). Кто-нибудь знает способ извлечения из кэша Three20 либо АСИНХРОННО, либо способ потоковой обработки Three20 TTURLRequest
, чтобы он хотя бы делал это в фоновом режиме?