2012-06-22 42 views
7

Tôi đang thực hiện yêu cầu tìm nạp trả về khoảng 2000 thực thể. Hiện tại, việc này mất khoảng 20 giây trên thiết bị của tôi. Vì vậy, tôi nghĩ rằng tôi có thể đặt giới hạn tìm nạp là 100 và sau đó khi người dùng cuộn đến cuối chế độ xem bảng, hãy tìm nạp 100 thực thể tiếp theo. Điều này có thể được thực hiện bằng cách sử dụng NSFetchRequest'ssetFetchLimitsetFetchOffset.Kết hợp tìm nạp dữ liệu lõi

Tuy nhiên, những gì tôi không thể tìm ra là, nếu trong lần tìm nạp thứ hai của tôi, nơi tôi đang tìm nạp đối tượng 101-200, điều gì sẽ xảy ra với các đối tượng 1-100? Tôi có phải sử dụng riêng biệt NSFetchedResultsController cho mỗi 100 mục và sau đó định cấu hình phương pháp nguồn dữ liệu chế độ xem bảng của mình thành truy vấn dựa trên nhiều bộ kiểm soát kết quả tìm nạp không? Hoặc bằng cách nào đó tôi có thể sử dụng cùng một NSFetchedResultsController bằng cách nào đó tìm nạp 100 thực thể cùng một lúc, nhưng sau mỗi lần tìm nạp tiếp theo, chỉ cần thêm 100 mục tiếp theo vào 100 mục gốc?

Edit: Đây là mã của tôi:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"MessageObject" inManagedObjectContext:appDelegate.managedObjectContext]; 

    [fetchRequest setEntity:entity]; 
    NSPredicate *predicate= [NSPredicate predicateWithFormat:@"ANY tags.tagName==%@", currentTagObject.tagName]; 
    [fetchRequest setPredicate:predicate]; 
    NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 
    [fetchRequest setFetchBatchSize:5]; 
+0

Bạn có thể hiển thị việc xây dựng yêu cầu tìm nạp không? Theo như tôi biết, lấy bộ điều khiển kết quả (và tôi nghĩ rằng yêu cầu tìm nạp đơn giản, quá) sử dụng lỗi để làm điều này cho bạn. Có thể là "truy vấn" của bạn có thể được tối ưu hóa. –

+0

Tôi đã đăng một số mã của mình. Tôi không hiểu - tại sao phải mất 20 giây để lấy các thực thể sau đó? Khi tôi đặt giới hạn là 100, nó sẽ tải xuống trong 1 giây, nhưng không có giới hạn, tìm nạp 2000 thực thể, phải mất 20 giây. – Snowman

Trả lời

2

Bạn không thực sự cần phải làm gì để đạt được quyến rũ trong lô kích thước mà bạn đã chỉ định. Bạn sẽ nhận được hành vi mà bạn mô tả đơn giản là thực hiện một yêu cầu tìm nạp đơn trên một bộ điều khiển đơn - bằng cách đặt thuộc tính kích thước lô, bạn chỉ đơn giản là gợi ý cho CoreData những gì bạn cho là kích thước lô tối ưu bằng cách xem xét riêng của bạn. CoreData sẽ xử lý các đối tượng tìm nạp trong các chuỗi tuần tự có kích thước được chỉ định khi bạn cần chúng - và nó sẽ quản lý các đối tượng lỗi khi cần thiết cho mức tiêu thụ bộ nhớ.

+0

Tại sao phải mất 20 giây để tìm nạp các thực thể đó? Khi tôi đặt giới hạn là 100, nó sẽ tải xuống trong 1 giây, nhưng không có giới hạn, tìm nạp 2000 thực thể, phải mất 20 giây. – Snowman

+0

Vâng, nó vẫn thực hiện tìm nạp dựa trên kích thước bạn chỉ định. Tìm nạp 100 nhanh hơn tìm nạp 2000. Trên fetchRequest của bạn, hãy đặt kích thước lô thành 50 hoặc 100. Vậy là xong. Không có gì khác. Tất cả các bản ghi của bạn sẽ tiếp tục tải khi cần thiết, vì CoreData xử lý các lỗi và lỗi tìm nạp cần thiết tiếp theo. – isaac

+0

Nhưng vì vậy đây không phải là giải pháp - tôi cần phải loại bỏ sự chờ đợi 20 giây, và thiết lập kích thước lô không xuất hiện để tạo sự khác biệt. Ngoài ra, những gì là lạ là tôi chỉ cần đặt batchSize đến năm 2000, và nó lấy trong 9 giây, so với một batchSize của 5 mà mất 20 giây. Có chuyện gì thế? – Snowman

3

Sử dụng BẤT CỨ là một hoạt động khá tốn kém. Tôi không chắc chắn về các mối quan hệ, nhưng bạn có thể thử tìm nạp thực thể thẻ của bạn cho tên thẻ cụ thể thay vì trên thực thể đối tượng mesage của bạn. Sau đó, sử dụng mối quan hệ nghịch đảo để có được các đối tượng đối tượng tin nhắn

Ngoài ra, sắp xếp của bạn đang sử dụng trình so sánh mà tôi chắc chắn không giúp ích gì. Ngày phải được lưu trữ bởi dữ liệu cốt lõi dưới dạng số nguyên, do đó bạn chỉ có thể thực hiện sắp xếp thẳng mà không cần sử dụng bộ chọn.

Dữ liệu cốt lõi rất nhanh, tôi đã thực hiện tìm kiếm từ khóa thông qua 65.000 bản ghi và đã trả về kết quả tính bằng mili giây.

Good luc

+0

Trong khi điều này là tất cả sự thật, nó không thực sự trả lời câu hỏi .... – lnafziger

+3

Nó không bao giờ về câu trả lời, chỉ là về hướng dẫn mọi người đi đúng hướng. – Snowman

+0

@tim thực sự là một ý tưởng hay, về việc truy xuất đối tượng thẻ đơn lẻ và nhận tập hợp thông báo. Sẽ nhanh hơn nhiều. Tuy nhiên, làm thế nào tôi có thể buộc điều đó lên đến một NSFetchedResultsController? Nếu một thẻ có 2000 đối tượng, tôi không muốn tải tất cả chúng vào bộ nhớ cùng một lúc. Với bộ điều khiển kết quả tìm nạp, chỉ một số ít trong số chúng sẽ được tải vào bộ nhớ tại bất kỳ thời điểm nào. – Snowman

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