Ленивая загрузка в цель C - PullRequest
20 голосов
/ 08 января 2010

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

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

Ответы [ 4 ]

28 голосов
/ 08 января 2010

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

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

Вот пример ленивой загрузки из шаблона Core Data:

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

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

4 голосов
/ 03 августа 2017

Это было бы подходящим способом в соответствии с 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;
}
3 голосов
/ 26 декабря 2011

В вашем * .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; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...