2009-08-12 26 views
6

Tôi đang phát triển một ứng dụng iPhone sử dụng nhiều dữ liệu cốt lõi, chủ yếu cho các tính năng giống như cơ sở dữ liệu của nó (chẳng hạn như khả năng đặt thứ tự sắp xếp hoặc biến vị ngữ trên các yêu cầu tìm nạp). Tôi trình bày tất cả các dữ liệu tôi lấy trong các UITableViewControllers khác nhau.Cocoa Touch: Khi nào một NSFetchedResultsController trở nên cần thiết để quản lý tìm nạp dữ liệu lõi?

Điều tôi muốn biết là một ý tưởng sơ bộ về số lượng đối tượng tôi có thể tìm nạp trước khi sử dụng NSFetchedResultsController để xử lý yêu cầu là một ý tưởng tốt. Trong tài liệu Core Data, nó nói rằng các cửa hàng SQLite xem xét "10.000 đối tượng là một tập dữ liệu khá nhỏ", nhưng trong tài liệu cho NSFetchedResultsController, nó đề cập đến việc giữ "hàng chục đối tượng" trong bộ nhớ tại một thời điểm.

Tôi đang xử lý chủ yếu với bộ dữ liệu có tối đa năm mươi đối tượng mà mỗi có thể có hàng tá trường hợp của NSNumber và NSString, cũng như mối quan hệ một-nhiều đối với tập hợp đối tượng tiếp theo (nghĩa là có hai mươi các cá thể của đối tượng A, mỗi đối tượng có mối quan hệ nhiều với một tập hợp ba mươi (riêng biệt) các đối tượng của đối tượng B, mỗi đối tượng trong số đó ...).

Kịch bản này có phù hợp để sử dụng NSFetchedResultsController hay tôi có thể lấy đi một NSArray đơn giản về kết quả? Tôi không có vấn đề gì với việc quản lý các niceties của controller (các phương thức thuận tiện để có được một đối tượng cho đường dẫn chỉ số UITableView, thêm các đối tượng mới trở lại ngữ cảnh, vv), tôi chỉ tự hỏi về việc sử dụng bộ nhớ của mỗi cách tiếp cận.

Tôi nên đề cập đến ứng dụng sẽ được nhắm mục tiêu chủ yếu ở iPhone 3G (không phải S) và người dùng iPod Touch thế hệ đầu tiên, vì vậy hãy nhớ giới hạn bộ nhớ của những nền tảng này.

Trả lời

11

NSFetchedResultsController là lớp trợ giúp vô cùng tiện dụng để giao tiếp dữ liệu lõi với UITableViews của bạn. Đề xuất của tôi sẽ là sử dụng nó với mỗi chế độ xem bảng có bản sao lưu Dữ liệu cốt lõi. Trong mọi trường hợp tôi đã sử dụng nó cho, nó làm giảm đáng kể số lượng mã tôi đã viết.

Hiệu suất-khôn ngoan, nó có thể dẫn đến một cải tiến rất lớn là tốt. Thay vì tìm nạp trong toàn bộ tập dữ liệu của bạn, nếu bạn sử dụng -setFetchBatchSize: với NSFetchRequest mà bạn nạp vào NSFetchedResultsController, bạn có thể thực hiện tìm nạp theo đợt nơi chỉ có dữ liệu có liên quan được hiển thị trong dạng xem bảng của bạn được tìm nạp. Dữ liệu không còn hiển thị cũng có thể được xóa khỏi bộ nhớ một cách tự động (hoặc do đó là sự hiểu biết của tôi).

Đối với các bảng có bộ dữ liệu từ trung bình đến lớn, điều này có thể dẫn đến một chiến thắng hiệu suất đáng kể. Các kỹ sư của Apple đã được trích dẫn khi nói rằng đối với một cơ sở dữ liệu 10.000 mục, điều này có thể làm giảm thời gian khởi động của bạn hơn 80% và mức sử dụng bộ nhớ của bạn bằng 50%.

+1

Tôi thứ hai điều này và không thể đề xuất đủ. Tôi đang trong quá trình viết lại ứng dụng của mình với CoreData và tôi đã thấy những lợi ích to lớn bằng cách sử dụng FetchedResultsController. – jbrennan

+0

Ngoại trừ cá nhân tôi đã gặp sự cố khi tải bộ dữ liệu bằng fetchResultsController và sẽ không thanh toán cho nó ngay bây giờ. Nó không có vẻ rõ ràng nó fetchedObjects một cách thích hợp khi phân trang qua chúng và có vẻ như địa ngục cong vào nắm giữ tất cả mọi thứ khi nó tải chúng. – TheCodingArt

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