Подтвердить что ты не робот

Ленивая загрузка в объективе C

Я слышал, что ленивая техника загрузки очень полезна для повышения производительности программы. Я разрабатываю игры для iPhone. Я не уверен, как можно применить ленивую загрузку в объекте C. Может ли кто-нибудь показать мне пример, пожалуйста?

Заранее спасибо

4b9b3361

Ответ 1

Общий шаблон для ленивой загрузки всегда более или менее одинаковый:

- (Whatever *)instance
{
    if (_ivar == nil)
    {
        _ivar = [[Whatever alloc] init];
    }
    return _ivar;
}
  • В своем классе добавьте ivar нужного вам типа и инициализируйте это значение в nil в конструкторе;
  • Создайте метод getter для этого ivar;
  • В getter, тест для nil. Если это так, создайте объект. В противном случае просто верните ссылку на него.

Ответ 2

Вот пример ленивой загрузки из шаблона основных данных:

- (NSManagedObjectModel *)managedObjectModel
{
    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
    return managedObjectModel;
}

В первый раз, когда запрашивается managedObjectModel, он создается кодом. В любое время после этого он уже существует (!= nil) и только что возвращается. Это один пример ленивой загрузки. Существуют и другие виды, такие как ленивая загрузка файлов NIB (загрузка их в память только тогда, когда они необходимы).

Ответ 3

В вашем классе *.h isDragging_msg и isDecliring_msg, эти 2 - значение BOOL. а также Dict_name NSMutableDictionary.

В поле зрения была загружена

Dict_name = [[NSMutableDictionary alloc] init];

В ячейке для строки по пути указателя

if ([dicImages_msg valueForKey:[[msg_array objectAtIndex:indexPath.row] valueForKey:@"image name or image link"]]) 
{ 
    cell.image_profile.image=[dicImages_msg valueForKey:[[msg_array objectAtIndex:indexPath.row] valueForKey:@"image name or image link"]];
}
else
{
    if (!isDragging_msg && !isDecliring_msg)
    {
        [dicImages_msg setObject:[UIImage imageNamed:@"Placeholder.png"] forKey:[[msg_array objectAtIndex:indexPath.row] valueForKey:@"image name or image link"]];
        [self performSelectorInBackground:@selector(downloadImage_3:) withObject:indexPath];
    }
    else
    {
        cell.image_profile.image=[UIImage imageNamed:@"Placeholder.png"];
    }
}

и для загрузки изображения функция: -

-(void)downloadImage_3:(NSIndexPath *)path
{
    NSAutoreleasePool *pl = [[NSAutoreleasePool alloc] init];

    NSString *str=[here Your image link for download];

    UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:str]]]; 

    [dicImages_msg setObject:img forKey:[[msg_array objectAtIndex:path.row] valueForKey:@"image name or image link same as cell for row"]];

    [tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

    [pl release];
}

и, наконец, поместите эти методы в свой класс

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    isDragging_msg = FALSE;     
    [tableview reloadData];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    isDecliring_msg = FALSE;
    [tableview reloadData]; 
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    isDragging_msg = TRUE;
}

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
    isDecliring_msg = TRUE; 
}

Ответ 4

Это будет подходящий способ в соответствии с Apple. Я согласен с ними по нескольким причинам:

  • Переменная static внутри метода будет сохраняться при нескольких вызовах.
  • Функция dispatch_once GDC гарантирует, что данный блок кода будет работать только один раз.
  • Это поточно-безопасный.

Objective-C:

- (AnyClass*)instance {

    static AnyClass *shared = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        shared = [[AnyClass alloc] init];
    });

    return shared;
}