2010-01-08 33 views
20

Tôi nghe kỹ thuật tải chậm khá hữu ích để tăng hiệu suất của chương trình. Tôi đang phát triển trò chơi cho iPhone. Tôi không chắc chắn làm thế nào là cách để áp dụng tải lười biếng trong mục tiêu C. Ai có thể cho tôi ví dụ xin vui lòng?Tải trọng lười trong mục tiêu C

Cảm ơn trước

+1

Lazy tải chính xác những gì? Bạn đang sử dụng dữ liệu lõi? Nếu vậy có tài liệu tốt về cân nhắc hiệu suất. –

Trả lời

28

Các mô hình chung cho tải lười biếng luôn nhiều hơn hoặc ít giống nhau:

- (Whatever *)instance 
{ 
    if (_ivar == nil) 
    { 
     _ivar = [[Whatever alloc] init]; 
    } 
    return _ivar; 
} 
  1. Trong lớp học của bạn, thêm một Ivar của các loại bạn cần, và khởi tạo mà để nil trong các nhà xây dựng;
  2. Tạo phương thức getter cho thanh răng đó;
  3. Trong getter, kiểm tra cho nil. Nếu vậy, hãy tạo đối tượng. Nếu không, chỉ cần trả lại tham chiếu đến nó.
+0

Nếu bạn muốn có thể cài đặt nó, bạn có thể sử dụng @property và @synthesize không?Nếu vậy, những thuộc tính nào (ví dụ, nonatomic, strong, etc) bạn có gán các thuộc tính không? – avance

+1

'@ synthesize' không còn được yêu cầu kể từ phiên bản mới nhất của Xcode, nhưng có, bạn luôn có thể xác định thuộc tính' @' và sau đó ghi đè trình setter và getter trong quá trình triển khai lớp của bạn. Các thuộc tính (mạnh, yếu, vv) chỉ nên được sử dụng sau đó để phản ánh việc thực hiện của riêng bạn; trình biên dịch sẽ cho bạn mã của bạn thay vì tạo ra bất kỳ mã nào. Hi vọng điêu nay co ich. –

+0

Có thư viện thực sự dễ dàng nào giúp bạn đạt được điều này không? – fatuhoku

6

Dưới đây là một ví dụ về tải lười biếng từ mẫu Core Data:

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

Lần đầu tiên các managedObjectModel được yêu cầu, nó được tạo ra bởi các mã. Bất cứ lúc nào sau đó, nó đã tồn tại (!= nil) và chỉ được trả lại. Đó là một ví dụ về tải chậm. Có các loại khác, chẳng hạn như tải các tệp NIB chậm (tải chúng vào bộ nhớ chỉ khi chúng cần).

3

Trong * .h class isDragging_msg và isDecliring_msg 2 giá trị này là giá trị BOOL. và Dict_name NSMutableDictionary.

Theo quan điểm đã tải

Dict_name = [[NSMutableDictionary alloc] init]; 

Trong tế bào cho hàng tại đường index

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"]; 
    } 
} 

và cho hình ảnh tải về chức năng là: -

-(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]; 
} 

và cuối cùng đặt những các phương thức trong lớp học của bạn

- (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; 
} 
+0

Phương pháp tiếp cận tốt ........ – Wolverine

3

Đây sẽ là cách thích hợp theo Apple. Tôi đồng ý với họ vì nhiều lý do:

  • Biến số static bên trong một phương thức sẽ tồn tại trong nhiều cuộc gọi.
  • Chức năng dispatch_once của GDC sẽ đảm bảo rằng khối mã đã cho sẽ chỉ chạy một lần.
  • Đó là chủ đề an toàn.

Objective-C:

- (AnyClass*)instance { 

    static AnyClass *shared = nil; 
    static dispatch_once_t onceToken; 

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

    return shared; 
} 
Các vấn đề liên quan