Objective-C中如何遍历NSSet<NSManagedObject *>并转数组用于表格展示
Objective-C CoreData NSSet 类型属性遍历与转换方案
快速转换为TableView可用数组
NSSet类型可以直接调用allObjects属性转换为NSArray,直接赋值给TableView的数据源数组即可:
// 假设你拿到的PORecord实例为currentPORecord NSArray *purchaseOrderList = currentPORecord.purchaseOrderItems.allObjects;
注意:直接转换的数组顺序不固定,如果需要列表展示顺序稳定,需要额外加排序规则
NSSet 遍历方法
1. 快速枚举遍历
for (NSManagedObject *item in currentPORecord.purchaseOrderItems) { // 可通过KVC或者类型转换后访问条目属性 NSString *itemNo = [item valueForKey:@"purchaseOrderNo"]; NSNumber *amount = [item valueForKey:@"totalAmount"]; }
2. Block 遍历
[currentPORecord.purchaseOrderItems enumerateObjectsUsingBlock:^(NSManagedObject *item, BOOL *stop) { // 遍历逻辑,遇到需要终止遍历的场景给*stop赋值为YES即可 NSLog(@"条目信息:%@", item); }];
优化方案:按规则排序后生成数组
为了保证TableView展示顺序稳定,建议对NSSet按指定字段排序后再生成数组:
// 例如按条目标识itemId升序排序,可根据业务需求替换排序字段和升降序规则 NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"itemId" ascending:YES]; NSArray *sortedOrderList = [currentPORecord.purchaseOrderItems sortedArrayUsingDescriptors:@[sortDescriptor]];
额外优化建议
- 如果
purchaseOrderItems对应的Core Data实体有自定义类,建议修改属性声明为对应自定义类类型,比如NSSet<POItem *> *purchaseOrderItems;,可获得编译器类型检查能力,避免类型转换错误 - 跨控制器传递PORecord对象时需确保关联的Core Data上下文未被释放,或提前预取完所有需要用到的属性,避免访问属性时出现数据为空或野指针问题
内容的提问来源于stack exchange,提问作者Matt Wilson
相关产品推荐
相关产品推荐

