2015-01-10 61 views
1

NSarray的簡單問題。我有存儲在NSMuteableArray中的對象。 [obj1,obj2,obj3]Simple NSArray - 將對象置於前面NSArray

如果選擇了一個對象,我想把它放到數組的前面。即如果OBJ 3選擇,然後:

[OBJ 3,OBJ1,OBJ2]

將下面的工作或重複OBJ 3?另外,這可以使線程安全嗎?

[myMutableArray insertObject:obj3 atIndex:0]; 
+0

如果您在前面插入obj3,它將與obj2無關。運行該行後,您的數組將是[obj3,obj1,obj2,obj3]。 –

+0

@DanWatkins對不起,我編輯了?並錯過了那部分。我可以將它移動到前面,而無需再次添加對象。並保持其餘訂單完好 – DaynaJuliana

+0

刪除它,然後將其添加在前面 – nielsbot

回答

4

假設你需要保留其他元素的順序,您需要刪除然後插入有問題的對象:

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]; 
+0

很好的答案。 (投票)。起初,我沒有注意到OP想要將所有其他元素向下移動,而不是用第一個項目交換有問題的項目,而是建議'exchangeObjectAtIndex:withObjectAtIndex:',而這不是OP想要的。 –

+0

@rmaddy,在修改之後 - 是否有辦法用NSPredicate來做到這一點,所以我不能在NSArray上執行此操作並保持它的線程安全? – DaynaJuliana

3

您的代碼將在陣列(即陣列現在將包含4種元素)的前插入另一參考obj3但不會實際複製的對象。

您需要使用exchangeObjectAtIndex:withObjectAtIndex -

[myMutableArray exchangeObjectAtIndex:0 withObjectAtIndex:selectedIndex] 

其中selectedIndex是被選中的對象的索引。

NSMutableArray不是線程安全的,因此如果您有可能從多個線程修改它或在另一個線程迭代它時修改它,您將需要圍繞訪問該陣列打包@synchronizsed(myMutableArray)

如果您想保留數組的順序之外的第一個元素,那麼你將需要執行一個單獨的刪除和插入操作 -

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

實際上這不會保持與@rmaddy所說的相同的順序 – DaynaJuliana

+0

您可以但仍然需要@synchronise複製操作 – Paulw11

+0

這並不能產生理想的結果。從1,2,3開始,這給出3,2,1,而不是3.1.2。 – rmaddy