【问题标题】:Capture default sorting in NSMutableArray?在 NSMutableArray 中捕获默认排序?
【发布时间】:2015-09-14 10:51:10
【问题描述】:

我有一个 NSMutableArray,其中包含从 CloudKit 检索到的对象。最初,我没有进行任何排序,因此它使用检索记录的任何排序顺序。在某些用户交互中,我需要为特定目的对其进行排序。但是,我希望能够撤消该排序并返回默认顺序。但由于我没有指定初始排序,我想知道是否有办法捕获初始排序顺序?我查看了 NSMutableArray 和 NSSortDescriptor 的文档,没有看到任何可以调用的方法。是否有我缺少的内置方式,或者是否有人有自定义方式来执行此操作? 谢谢!

【问题讨论】:

  • 您应该从一些已知的、合理的排序顺序开始。为什么要从一些未知的随机顺序开始?
  • 我可能会,但现在我可以接受从 CloudKit 中检索它的顺序。

标签: ios objective-c nsmutablearray nssortdescriptor


【解决方案1】:

AFAIK,NSArray(因此NSMutableArray)没有任何特殊的默认排序。它们的顺序就是最开始添加的顺序对象。

NSArray *arr1 = @[@1, @2, @3];
NSLog(@"%@", arr1); // (1, 2, 3)

NSArray *arr2 = @[@3, @1, @2];
NSLog(@"%@", arr2); // (3, 1, 2)

您的问题的一个解决方案是存储初始数组,当用户想要对其进行排序时,您复制初始数组,对其进行排序并将其显示给用户,同时保留原始数组。如果用户想要撤消该操作,您只需显示原始数组并删除排序后的副本。

这是非常基本的伪代码:

NSMutableArray *originalArray = [self arrayFromCloudKit]; // fetch from CloudKit

// now the user wants it sorted alphabetically 
NSMutableArray *alphabeticallySorted = originalArray.mutableCopy
[alphabeticallySortedsortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
[self storeOriginalArray:originalArray];
[self displayUIWithArray:alphabeticallySorted];

// but if the user changes their mind, you just fetch the original and delete the sorted
NSMutableArray *originalArray = [self getOriginalArray];
[self displayUIWithArray:originalArray];

【讨论】:

  • 谢谢。我曾想过这一点,但试图避免重复数据,即创建另一个数组以仅使用排序的数据,反之亦然。似乎有一种方法可以捕获当前排序并因此保留它。但如果没有,我可能不得不接受你的建议。
  • @SonnyB - 这里的方法不是“复制数据”,它只是创建第二个数组,它引用与原始数组完全相同的数据(即您的对象)。除非您有一个非常大的数组,否则第二个容器的开销不太可能成为问题。将第二个数组视为对相同数据的排序视图。
  • 好点...是的,我知道内存/性能的差异可能可以忽略不计,但我想我是尽量保持精简。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 2017-11-17
  • 1970-01-01
  • 2018-09-16
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多