2016-10-28 20 views
6

Tôi muốn hiển thị dữ liệu vì nó đến từ backend Vì vậy, chúng ta hãy có một tập tin ví dụ json:NSOrderedSet phản hồi từ máy chủ và Core Data

{ 
    "fonts": [ 
    { 
     "name": "Helvetica", 
     "styleIdentifier": "H0", 
     "size": 17 
    }, 
    { 
     "name": "Helvetica", 
     "styleIdentifier": "H1", 
     "size": 14 
    }, 
    { 
     "name": "Helvetica-Bold", 
     "styleIdentifier": "H0Bold", 
     "size": 17 
    }, 
    { 
     "name": "HelveticaNeue-Light", 
     "styleIdentifier": "H0Light", 
     "size": 40 
    } 
    ] 
} 

Vì vậy, tôi tạo ra một relationship (nhiều - nhiều) với ordered tùy chọn chọn . Và bởi đầu vào tôi thấy nó luôn viết theo cùng một cách với Dữ liệu cốt lõi, nhưng khi tôi cố gắng tìm nạp nó

configuratation.fonts nơi fonts là một mặt hàng hoàn toàn ngẫu nhiên. Tôi nhớ sth trong spec? Hay tôi nên phân loại nó bằng cách nào đó?

__EDIT__

Thứ nhất khi tôi nhận được một dữ liệu từ trên json Tôi có một cấu hình thiết lập với quan hệ phông chữ trống rỗng. Sau đó, tôi lấy thông tin này và chèn nó vào dữ liệu chính với:

NSMutableArray *returnArray = [NSMutableArray new]; 
for(NSDictionary *fontDictionary in jsonArray) { 
    Font *fontObj = [Font font:fontDictionary inContext:context]; 
    [returnArray addObject:fontObj]; 
} 

Và trong dữ liệu mảng này theo đúng thứ tự. Sau đó, trong đối tượng cấu hình i thêm nó vào NSOrderedSet bởi:

-(void)appendTracks:(NSArray<Font*>*)fontArray { 
    self.fonts = [NSOrderedSet orderedSetWithArray: fontArray]; 
} 

Và sau đó tôi cố gắng lấy nó bằng cách chỉ cần sử dụng tài liệu tham khảo:

configuration.fonts 

Và trong bước này dữ liệu là hoàn toàn không theo đúng thứ tự.

+0

Vui lòng chỉnh sửa câu hỏi của bạn để cho biết cách bạn đang tìm nạp dữ liệu khi bạn nhận được dữ liệu theo thứ tự sai. –

+0

Tôi đã thêm cả hai - dữ liệu đầu vào và đầu ra – Kuba

+0

Tôi không nhận được nó sau đó - nếu tôi cần thêm thuộc tính whats sự khác biệt trong dữ liệu cốt lõi giữa NSSet và NSOrderedSet? – Kuba

Trả lời

2

Không trực tiếp đặt NSOrderedSet.

Hoặc sửa đổi các thiết lập hiện có:

[self.fonts addObjectsFromArray:fontArray]; 

Hoặc:

Xcode tạo ra phương pháp để thêm và loại bỏ các mục từ bộ lệnh trong tạo NSManagedObject lớp.

Giả sử bạn có một Entity gọi ManagedConfiguration nắm giữ một yêu cầu đối với nhiều mối quan hệ được gọi là fonts:

ManagedConfiguration *managedObjectConfigurationInstance = //create or fetch configuration in ManagedObjectContext 
NSOrderedSet<ManagedFont> *fonts = //created or fetched fonts in wanted order 
managedObjectConfigurationInstance.addToFonts(fonts) 

replaceFonts, removeFromFontsAtIndex aso. các phương thức cũng được tạo ra.


Tùy thuộc vào yêu cầu của bạn, bạn có thể muốn để lưu trữ các phông chữ theo thứ tự ngẫu nhiên và áp dụng một NSSortDescriptor để NSFetchRequest của bạn để lấy dữ liệu theo một thứ tự cụ thể.

1

Thay vì cố gắng để thiết lập dữ liệu trực tiếp đến tài sản của bạn (fonts), bạn cần phải đầu tiên lấy bản sao có thể thay đổi các NSOrderedSet của bạn từ NSmanagedObject Subclass (tôi giả sử nó được Font).

NSMutableOrderedSet *orderedSet = [self mutableOrderedSetValueForKey:@"fonts"]; 

Sau đó thêm các đối tượng từ mảng này vào bộ đặt hàng.

[orderedSet addObjectsFromArray:array]; 

Bây giờ bạn đã đặt đúng giá trị cho khóa fonts. Vì vậy, chức năng appendTracks của bạn sẽ trông giống như sau.

-(void)appendTracks:(NSArray<Font*>*)fontArray { 
    NSMutableOrderedSet *orderedSet = [self mutableOrderedSetValueForKey:@"fonts"]; 
    [orderedSet addObjectsFromArray:fontArray]; 
} 

Bây giờ, hãy thực hiện yêu cầu tìm nạp của bạn. Bạn sẽ nhận được dữ liệu theo thứ tự được đặt trong mảng.

PS: Tôi đã sử dụng phản hồi JSON của bạn để kiểm tra điều này.

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