2014-02-14 2 views

답변

7

이에 대한 Grand Central Dispatch를 사용할 수 있습니다

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{ 
    // Call your method. 
}); 
+0

재귀 적으로 이것을 호출할까요? – Tukajo

+0

이제 '재귀'라는 질문에 태그를 추가했습니다. 아니요,이 코드는 백그라운드 스레드의 블록에 넣은 코드를 실행하기 만하면됩니다. 재귀 나 반복과 함께 GCD를 사용할 수 있습니다. GCD의 목적은 동시 코드 실행을 향상시키는 것입니다. – geraldWilliam

+2

이 질문을 찾는 사람들은 dispatch_apply에 대한 응답을 0x7fffffff에서 확인하십시오. – geraldWilliam

1

당신은 사용할 수 있습니다

[self performSelectorInBackground:@selector(aMethod) withObject:nil]; 

을 매개 변수없이하는 방법에 대해. 또는 매개 변수가있는 경우

[self performSelectorInBackground:@selector(otherMethodWithString:andData:) withObjects:string, data, nil]; 

등이 있습니다.

1

백그라운드 대기열을 실행하고 그 안에있는 사용자와 반복하는 방법을 설명하는 또 다른 예입니다.

- (void)method 
{ 
    // start a background proccess that will not block the UI 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     for (int i = 0; i < 1000000; i++) { 

      if (i == 999) { 

       // Need to iterate with interface elements when inside a background thread. 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Found" message:@"Found your number" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
        [alertView show]; 
       }); 
      } 

      NSLog(@"Count: %d",i); 
     } 

    }); 
} 
+0

'i> 1000000'이 아니라'i <1000000'을 원한다. – rmaddy

+0

고마워, 고쳐. – alexandresoli

+0

숫자가 999 일 때 알림이 하나만 표시됩니다. – alexandresoli

1

다른 사람들처럼 GCD를 사용하는 것이 좋은 방법입니다.

작업을 취소 할 수 있도록하려면 (예 : 웹 리소스를로드하는 경우) NSOperation의 서브 클래스를 만들고 isCancelled을 확인하는 것이 좋습니다.

( AFNetworking 실제로이 (예를 들어, AFHTTPRequestOperationManager)/관리 웹 요청을 만드는 않습니다.)

체크 아웃 애플 NSOperation에 문서 및 NSOperation들에 대한 자세한 내용은도 this tutorial on Ray Wenderlich's site.

5

이 작업을 수행하려면 확실히 Grand Central Dispatch을 사용하고 싶지만 GCD에는 이런 종류의 메서드 만 있습니다. dispatch_apply()은 당신이 선택한 큐에서 지정된 횟수만큼 블록을 실행합니다. 물론 당신이 진행중인 반복을 추적합니다. 다음은 그 예입니다 :

size_t iterations = 10; 

dispatch_queue_t queue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL); 

dispatch_apply(iterations, queue, ^(size_t i) { 
    NSLog(@"%zu",i);// Off the main thread. 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Go back to main queue for UI updates and such 
    }); 
}); 
관련 문제