2009-09-01 10 views
6

Tôi đang đặt NSFetchedResultsController vào mã của mình để tôi nhận được phần tự động tốt đẹp của dữ liệu chế độ xem bảng của mình.Cách định cấu hình đúng cách NSFetchedResultsController

Vì vậy, tôi đang chạy thử nghiệm để đảm bảo mọi thứ hoạt động bình thường. Tôi có một thực thể Sách duy nhất trong cửa hàng liên tục của mình. Trước tiên tôi sẽ thực hiện tìm nạp theo cách cũ, sau đó tôi sẽ cố gắng sử dụng NSFetchedResultsController. Sự khác biệt giữa 2 khối mã chỉ là 2 dòng.

mà không NSFetchedResultsController:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

    //The following 2 lines will be replaced by the NSFetchedResultsController 
NSMutableArray *mutableFetchResults = [[[self.managedObjectContext executeFetchRequest:request error:nil] mutableCopy] autorelease]; 
Book *result = (Book*)[mutableFetchResults objectAtIndex:0]; 

NSString* title = [result valueForKey:@"title"]; 
NSString* priority = [result valueForKeyPath:@"priority.name"]; 


[request release]; 

Bây giờ tôi thay thế trong các dòng cho NSFetchedResultsController:

NSFetchedResultsController* fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"];                                                                           

Book *result = (Book*)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 

có vẻ khá cắt và khô. Khối mã đầu tiên tìm nạp đúng thực thể Sách đơn lẻ. Tuy nhiên, mã với NSFetchedResultsController thì không. Thay vào đó nó trả về nil.

Câu hỏi của tôi là: Tôi có đang định cấu hình đúng NSFetchedResultsController trong ví dụ này không?

(lưu ý, các fetchedObjects tài sản của NSFetchedResultsController cũng là con số không)

Trả lời

13

Tôi nghĩ rằng bạn vẫn cần phải nói với NSFetchedResultsController để thực sự thực hiện lấy:

NSError *error; 
BOOL success = [controller performFetch:&error]; 

(lấy từ ví dụ trong NSFetchedResultsController tham chiếu)

một điều khác có vẻ lạ: bạn có thực sự muốn sử dụng "tiêu đề" làm sectionNameKeyPath không? điều đó về cơ bản không tạo ra một phần riêng biệt cho mỗi cuốn sách?

+0

tổ chức "tiêu đề" chỉ là một thử nghiệm để thiết lập và chạy nó. Tôi thực sự muốn chia theo một con đường chính trên tên tác giả, nhưng muốn làm cho nó hoạt động với một ví dụ đơn giản. –

+0

Đó là khá buồn mà tôi đã không thực sự thực hiện lấy. Tôi không biết tại sao tôi giả định việc lấy được thực hiện khi khởi tạo. Cảm ơn –

+0

cảm ơn, điều đó giúp tôi :) – mateusmaso

7

Bạn cần phải khởi tạo NSFetchedResultsController của bạn chỉ một lần, như follows.The đang giả định

NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 

được khai báo trong phần đầu của bộ điều khiển của bạn, và đó managedObjectContext đã được khởi tạo đúng cách.

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     // Handle error 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

    } 

    NSLog(@"%d objects fetched", [[fetchedResultsController fetchedObjects] count]); 
} 

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 

    } 

    /* 
    Set up the fetched results controller. 
    */ 



    // Create the fetch request for the entity. 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
    [request setEntity:entity]; 

/* Optional settings 

    [request setResultType:NSManagedObjectResultType]; 
    [request setIncludesPropertyValues:YES]; 
    [request setIncludesPendingChanges:NO]; 
    [request setReturnsObjectsAsFaults:NO]; 
*/ 


    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release];; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [request release]; 


    return fetchedResultsController; 
}