【问题标题】:Simple NSArray - Bring object to to front NSArray简单的 NSArray - 将对象带到前面 NSArray
【发布时间】:2015-01-10 02:19:46
【问题描述】:

NSarray 的简单问题。我将对象存储在 NSMuteableArray 中。 [obj1, obj2, obj3]

如果选择了一个对象,我想把它放在数组的前面。 IE。如果选择了obj3,那么:

[obj3, obj1, obj2]

下面的工作或复制 obj3 吗?另外,这可以成为线程安全的吗?

[myMutableArray insertObject:obj3 atIndex:0];

【问题讨论】:

  • 如果在前面插入obj3,则与obj2无关。运行该行后,您的数组将是 [obj3, obj1, obj2, obj3]。
  • @DanWatkins 抱歉,我编辑了 ?并错过了那部分。我可以将它移到前面而不再次添加对象吗?并保持剩余订单不变
  • 去掉,然后在前面添加
  • NSMutableArray * tempArray = [array mutableCopy]; [tempArray removeObject:obj3]; [tempArray insertObject:obj3 atIndex:0]; array = tempArray;
  • @nielsbot 谢谢!我在将我的属性从 NSMuteable Array 更改为 NSArray 和通过 muteableCopy 方法操作它之间陷入困境。与同步属性相比,这似乎更容易且线程安全。

标签: ios objective-c nsarray


【解决方案1】:

假设您需要保留其他元素的顺序,您需要删除然后插入有问题的对象:

NSMutableArray *array = ... // array with objects
NSInteger index = ... // index of object to move to the front
id obj = array[index];
[array removeObjectAtIndex:index];
[array insertObject:obj atIndex:0];

【讨论】:

  • 好答案。 (已投票)。起初我没有注意到 OP 想要将所有其他元素向下移动而不是将有问题的项目与第一个项目交换,而是建议exchangeObjectAtIndex:withObjectAtIndex:,但这不是 OP 想要的。跨度>
  • @rmaddy,在修改后 - 有没有办法用 NSPredicate 做到这一点,所以我不能在 NSArray 上执行此操作并保持线程安全?
【解决方案2】:

您的代码将在数组的前面插入另一个对 obj3 的引用(即,数组现在将包含 4 个元素),但实际上不会复制对象。

你需要使用exchangeObjectAtIndex:withObjectAtIndex -

[myMutableArray exchangeObjectAtIndex:0 withObjectAtIndex:selectedIndex]

其中selectedIndex 是所选对象的索引。

NSMutableArray 不是线程安全的,因此如果您可能从多个线程修改它或在另一个线程迭代它时修改它,则需要将 @synchronizsed(myMutableArray) 包装在对该数组的访问周围。

如果您想在第一个元素之后保留数组的顺序,那么您需要执行单独的删除和插入操作 -

id someObject=myMutableArray[selectedIndex];
[myMutableArray removeObjectAtIndex:selectedIndex];
[myMutableArray insertObject:someObject atIndex:0]; 

【讨论】:

  • 实际上这并没有像@rmaddy所说的那样保持顺序
  • 你可以,但你仍然需要@synchronise 复制操作
  • 这没有给出预期的结果。从 1,2,3 开始,这给出 3,2,1,而不是 3.1.2。
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
相关资源
最近更新 更多