2015-01-10 1 views
1

NSarray에 대한 간단한 질문. 객체가 NSMuteableArray에 저장되어 있습니다. [obj1, obj2, obj3]간단한 NSArray - 객체를 앞에 NSArray로 가져 오기

개체가 선택되면이 개체를 배열의 맨 앞으로 가져 오려고합니다. 나는. OBJ3 선택하면, 다음 :

[OBJ3,으로 obj1, obj2보다]

는 아래의 작업 또는 OBJ3 중복 것인가? 또한 스레드로부터 안전하게 할 수 있습니까?

[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, revisting 후 NSArray에서 이것을 수행하고 스레드를 안전하게 유지할 수 없도록 NSPredicate에서 이것을 수행하는 방법이 있습니까? – DaynaJuliana

3

코드는 배열 (예. 배열이 지금 4 개 요소를 포함한다)의 전면에 obj3 또 다른 참조를 삽입합니다하지만 실제로 개체를 복제하지 않습니다. selectedIndex가 선택한 객체의 인덱스입니다

[myMutableArray exchangeObjectAtIndex:0 withObjectAtIndex:selectedIndex] 

-

당신은 exchangeObjectAtIndex:withObjectAtIndex를 사용해야합니다.

NSMutableArray은 스레드로부터 안전하지 않으므로, 잠재적으로 여러 스레드에서 수정하거나 다른 스레드가 반복하는 동안 수정하려는 경우 @synchronizsed(myMutableArray)을이 배열에 액세스해야합니다. ,

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

사실 이것은 @rmaddy와 같은 순서를 유지하지 않습니다. – DaynaJuliana

+0

하지만 여전히 복사 작업을 동기화해야합니다. – Paulw11

+0

원하는 결과를 얻지 못합니다. 1,2,3부터는 3.1.2가 아니라 3,2,1이 나온다. – rmaddy

관련 문제