2011-08-26 27 views
14

Ví dụ tôi đã NSFetchedResultsController gọi tại ListController gọi FetchControllerTại sao chúng tôi không thể thay đổi FetchRequest tại NSFetchedResultsController?

+(NSFetchRequest *)fetchRequestInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending; 

+(NSFetchedResultsController *) searchControllerInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending 
{ 
    NSFetchRequest *request = [self fetchRequestInContext:entityName :predicate :sortKey :sortAscending]; 

    NSFetchedResultsController * FRC=[[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[ThreadClass managedObjectContext] sectionNameKeyPath:Nil cacheName:Nil]autorelease]; 
    NSLog(@"FRC : %@",FRC); 
    return FRC; 
} 

nhìn vào mã mà, tôi gọi searchControllerInContext khi tôi muốn làm cho NSFetchedResultsController và sau đó phí phạm nó với mã này:

if (![[self ListController].FetchController performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

vấn đề là Tôi không muốn luôn thực hiện Tìm nạp khi yêu cầu thay đổi, tôi muốn làm cho nó dễ dàng với

[self ListController].FetchController.fetchRequest=[self FunctionTogetNewRequest]; 

nhưng [tự ListController] .FetchController.fetchRequest là chỉ đọc ..

Tôi muốn làm điều này bởi vì tôi không muốn perfomFetch một lần nữa và một lần nữa .. tôi có thể làm điều đó?

Ý tôi là, nếu tôi có chương trình cung cấp bản ghi dựa trên nội dung người dùng đưa vào hộp tìm kiếm, tôi có nên tạo bộ điều khiển mới mỗi khi nội dung hộp tìm kiếm thay đổi không? Điều đó thật kỳ lạ. Tôi nghĩ rằng toàn bộ các điểm sử dụng NSFetchedResultsController là vì vậy chúng tôi không phải làm điều đó?

Trả lời

23

Mặc dù fetchRequest là thuộc tính chỉ đọc, bạn có thể sửa đổi nó. Ví dụ: đặt vị từ của yêu cầu tìm nạp hoạt động hoàn toàn tốt miễn là bạn không lưu vào bộ nhớ cache kết quả (hoặc miễn là bạn xóa bộ nhớ cache trước). Tôi đã sử dụng kỹ thuật này thành công trong một số dự án. Sau khi sửa đổi yêu cầu tìm nạp, bạn nên gọi lại performFetch.

Điểm mấu chốt: bạn không cần phải tạo FRC mỗi khi cụm từ tìm kiếm thay đổi. Chỉ cần xóa bộ nhớ cache của bạn, thay đổi vị từ của yêu cầu tìm nạp và tìm nạp tập kết quả mới với cá thể hiện tại của bạn.

+0

Điều gì sẽ xảy ra nếu tôi lưu trữ kết quả? Tôi có cần gọi lại performFetch nếu tôi không lưu lại kết quả không? –

+0

Sửa đổi yêu cầu tìm nạp sẽ làm cho kết quả được lưu trong bộ nhớ cache của bạn không hợp lệ. Bất cứ khi nào bạn sửa đổi yêu cầu tìm nạp, bạn nên tìm nạp lại tập kết quả của mình. –

+3

Trong khi điều này có thể hoạt động, hãy xem xét những gì Apple viết trong tài liệu của nó: 'QUAN TRỌNG Bạn không được sửa đổi fetchRequest sau khi gọi phương thức này [NSFetchedResultsController init method]. Ví dụ: bạn không được thay đổi vị từ hoặc thứ tự sắp xếp.' – fabb

10

nếu tôi có một chương trình mà cho hồ sơ dựa trên những gì người sử dụng đưa vào hộp tìm kiếm, tôi nên tạo một bộ điều khiển mới mỗi khi tìm kiếm hộp thay đổi nội dung?

Có, vì bạn thay đổi vị từ trên tìm nạp yêu cầu tạo bộ điều khiển mới.

Tôi nghĩ rằng toàn bộ điểm sử dụng NSFetchedResultsController là vì vậy chúng tôi không phải làm điều đó?

Điểm của FRC là tự động xử lý tương tác giữa ngữ cảnh và chế độ xem bảng. Nó có các thuộc tính chuyên dụng để trả về các phần và các hàng cũng như các phương thức ủy nhiệm để sửa đổi bảng theo các thay đổi trong mô hình dữ liệu. Vì FRC được xác định bởi tìm nạp của nó, khi bạn thực hiện thay đổi cho tìm nạp, bạn cần tạo một FRC mới

Đừng mắc sai lầm khi nghĩ về FRC có một đối tượng đắt tiền. Nó không phải. Không có vấn đề gì với việc tạo và xử lý một số lượng lớn FRC khi cần thiết.

Các vấn đề liên quan