Три20 TTURLRequest Синхронный кэш (сделать его асинхронным или поточным)? - PullRequest
1 голос
/ 30 марта 2011

В настоящее время я работаю с библиотекой 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, чтобы он хотя бы делал это в фоновом режиме?

...