2011-02-09 2 views
2

나는 GCD를 내 코드에 통합하려고하는데, 심각한 병목 현상은 대규모 배열의 개체간에 수행하는 거품 비교라는 것을 알게되었습니다. 다음은 원래 코드입니다.Objective-C Fast Enumeration 버블 정렬

NSUInteger count = [arrayToDoWorkOn count]; 
for (int i = 0; i < count; i++) 
{ 
    for (int j = i + 1; j < count; j++) 
    { 
     [[arrayToDoWorkOn objectAtIndex:i] compare:[arrayToDoWorkOn objectAtIndex:j]]; 
    } 
} 

내 드리프트를 가져 옵니까? 그래서 다른 빠른 열거 작업의 많은 쉽게로

for (id obj in array) 
{ 
    [obj aMessage:stuff]; 
} 

를 변환하여 GCD'd 할 수 있습니다

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{ 
    [obj aMessage:stuff]; 
}]; 

내보기 미리-그렇다고 거품-그렇다고 알고리즘을 변환하는 방법이 있나요 - 내가 GCD 블록 구현에 제공 할 수있는 것?

+0

GCD 전용 블록과는 아무런 관련이 없습니다. – JeremyP

+0

안녕하세요, 내 대답이 내 질문에 답한 경우 정답으로 표시하는 것을 잊지 마세요. ;) –

+0

WHOOPS. 이미 그랬다고 맹세 할 수 있겠 어. 어제는 꽤 바빴다. 다시 한번 감사드립니다. – Grimless

답변

9

NSArray에 이미 기본 제공되는 방법이 내장되어있는 경우 사용자 지정 정렬을 구현하지 않는 것이 좋습니다. 사용자가 취할 수있는 것보다 더 빨리 정렬 할 가능성이 높습니다. 당신은 그냥 사용할 수 있습니다 :

NSArray *sortedArray = [arrayToDoWorkOn sortedArrayWithComparator:^(id firstObject, id secondObject) { 
    /* comparison code (e.g. return [[firstObject title] compareTo:[secondObject title]], or something) */ 
}]; 

을 이제, 정렬 동안 개체를 사용해야 할 경우, (빠른 당신은 피클을위한에있어,하지만 난 거품 정렬보다 더 효율적 종류를 조사하는 것이 좋습니다 것 정렬 꽤 좋은 것입니다).


이 외에도 GCD에 대해 다소 혼란 스럽습니다. 블록을 작성하고 사용하는 것은 본질적으로 GCD로 블록을 실행하지 않습니다. 수동으로 수행해야하는 작업 (엄밀히 말하자면, 블록은 단순히 코드 행 모음이며 본질적으로 GCD와 관련이 없으며 GCD는 블록을 실행에 사용하기 만 함). NSArrayenumerateObjectsUsingBlock: 메서드는 배열을 열거하기 위해 GCD를 사용하지 않을 것입니다 (적어도 참조는 이에 대한 통찰력을 제공하지 않으므로 잘못 생각하십시오). 그렇다면 블록을 제공했기 때문이 아니라, 오히려 그것이 애플이 그것을 어떻게 구현했는지에 대한 이유이기 때문이다. 대부분의 블록을 사용하는 메소드는 GCD를 사용하여 블록을 실행하지 않습니다.

코코아 사무라이의 와 코코아 사무라이의 A Guide to Blocks and GCD을 읽어 보시면 주제에 대한 더 자세한 정보를 얻을 수 있습니다.

+1

+1 GCD에 익숙하지 않은 분들에게 매우 유익합니다. –

+5

'-enumerateObjectsUsingBlock :'은 GCD를 사용할 이유가 전혀 없습니다. GCD를 사용하는 변형은'-enumerateObjectsWithOptions : usingBlock :'과'NSEnumerationConcurrent' 옵션을 지정한 것입니다. –

+0

우리는 간다. 그것이 내가 생각했던 거죠. –

0

This 게시물은 귀하 또는 다른 유사한 질문을하는 다른 사람들을 도울 수 있습니다.