2012-01-05 32 views
8

Tôi đang viết một phương thức API trả về một danh sách các đối tượng từ một dịch vụ web. Dịch vụ này cũng lưu trữ kết quả và cố gắng trả về kết quả được lưu trong bộ nhớ cache (nếu có) trước khi nhấn lại vào dịch vụ web. Vì vậy, tôi đang lưu trữ danh sách này trong một thực thể Core Data. Nhưng Core Data chỉ cho phép các mối quan hệ có thể được lưu trữ trong một NSSet, mà không bảo vệ trật tự. Nhưng tôi muốn các kết quả được lưu trong bộ nhớ cache để giữ lại thứ tự ban đầu (ban đầu là từ dịch vụ web). Tôi không nhất thiết phải biết cách đặt hàng đó (vì vậy tôi không thể sắp xếp).Làm cách nào để giữ một danh sách có thứ tự trong Dữ liệu chính

Vậy làm cách nào tôi có thể bảo toàn đơn hàng này? Kế hoạch của tôi là lưu trữ một chuỗi có id đối tượng mà sau này tôi có thể sử dụng để đặt hàng chúng:

NSString *objectIds = @"1 5 2 9 4"; 

Đây có phải là cách tốt nhất để làm điều đó không?

Trả lời

10

Nếu bạn có thể nhắm mục tiêu iOS 5 thì bạn có thể sử dụng tính năng NSOrderedSet mới cho các mối quan hệ Dữ liệu cốt lõi được sắp xếp tùy ý. Xem Core Data Release Notes for iOS 5 để biết thêm thông tin về tính năng mới này.

Nếu bạn phải hỗ trợ iOS 4 thì bạn sẽ cần tự xử lý việc đặt hàng. Một cách phổ biến để làm điều này là thêm một thuộc tính số nguyên vào mô hình của bạn mà sau đó bạn cần quản lý chính mình. Sau đó, bạn có thể sắp xếp thuộc tính này khi tìm nạp dữ liệu của bạn.

Việc lưu trữ thứ tự trong một chuỗi hoàn toàn khác có vẻ như là cách sai để thực hiện. Nếu thứ tự quan trọng, thông tin này phải có trong mô hình và người dùng có thể truy vấn trực tiếp ("cho tôi năm đối tượng đầu tiên của danh sách cụ thể này", hoặc "chỉ mục của đối tượng foo"). Có để có được một chuỗi các ID đối tượng, phân tích cú pháp nó, và sau đó truy vấn cho một số ID đối tượng cảm thấy rất sai với tôi.

+1

Thực ra, tôi nghĩ điều đó chỉ hữu ích cho nhiều mối quan hệ. – 3lvis

+0

@SebastianCelis đây là một câu trả lời tuyệt vời, rất hữu ích cho một người như tôi, người đang học iOS Dev lần đầu tiên :) Cảm ơn bạn. – GangstaGraham

+0

Như bình luận viên khác cho biết NSOrderedSet chỉ có sẵn cho nhiều mối quan hệ. Ngoài ra, ghi chú phát hành cho iOS 5 không còn khả dụng nữa. – Ixx

1

Đó là một câu hỏi chủ quan. Bạn cũng có thể thiết lập chúng dưới dạng danh sách được liên kết theo thứ tự bạn muốn.

1

Bao gồm trường id NSNumber của riêng bạn trong mô hình CoreData mà bạn đang lưu trữ đối tượng. Id sẽ đại diện cho thứ tự bạn muốn giữ lại; bạn sẽ phải tự mình đặt nó. Sau đó, khi bạn lấy các đối tượng từ CoreData, bạn có thể làm như vậy được sắp xếp theo id đó. Bạn có thể muốn/phải duy trì một nơi nào đó giá trị id cao nhất mà bạn đã chỉ định để duy trì thứ tự chính xác với các cuộc gọi dịch vụ web và các lần khởi chạy ứng dụng tiếp theo.

+0

Điều đó có hiệu quả, nhưng có vẻ như chi phí cao hơn nhiều so với một chuỗi đơn giản, mặc dù tôi không chắc chắn về mức độ hiệu quả của Dữ liệu cốt lõi với các chuỗi hơi lớn. – caleb

+0

Trong khi id đối tượng là giá trị, tôi tin rằng bạn có thể dựa vào việc không thay đổi sau lưng, sử dụng trường id của riêng bạn có giá trị được đặt từ chỉ mục tổng thể tăng đơn điệu mà bạn duy trì ở nơi khác chắc chắn sẽ sạch hơn. Tôi hoàn toàn có được khái niệm về cân bằng phức tạp với sự tiện lợi. Nếu bạn đã sao chép các thành viên dữ liệu của từng đối tượng (từ dịch vụ web) vào các thành viên dữ liệu của các đối tượng CoreData tương ứng, thêm một trường nữa cho một id sẽ không phải là mã nhiều hơn nữa. –

+0

Dữ liệu cốt lõi không xử lý 'NSOrderedSet' khi được sử dụng kết hợp với mogenerator, vì vậy tùy chọn này, trong khi tốn kém hơn để làm (kiểm tra và tìm hiểu) sẽ hoạt động tốt hơn. – fatuhoku

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