Ленивая загрузка в объективе C
Я слышал, что ленивая техника загрузки очень полезна для повышения производительности программы. Я разрабатываю игры для iPhone. Я не уверен, как можно применить ленивую загрузку в объекте C. Может ли кто-нибудь показать мне пример, пожалуйста?
Заранее спасибо
Ответы
Ответ 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;
}