꽤 일반적인 질문입니다. UI로드를 차단하지 않고 응용 프로그램을 자주 사용하는 메서드를 호출하는 방법이 있습니까?UI를 차단하지 않고 메서드를 반복적으로 호출하려면 어떻게해야합니까?
답변
이에 대한 Grand Central Dispatch를 사용할 수 있습니다
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{
// Call your method.
});
재귀 적으로 이것을 호출할까요? – Tukajo
이제 '재귀'라는 질문에 태그를 추가했습니다. 아니요,이 코드는 백그라운드 스레드의 블록에 넣은 코드를 실행하기 만하면됩니다. 재귀 나 반복과 함께 GCD를 사용할 수 있습니다. GCD의 목적은 동시 코드 실행을 향상시키는 것입니다. – geraldWilliam
이 질문을 찾는 사람들은 dispatch_apply에 대한 응답을 0x7fffffff에서 확인하십시오. – geraldWilliam
당신은 사용할 수 있습니다
[self performSelectorInBackground:@selector(aMethod) withObject:nil];
을 매개 변수없이하는 방법에 대해. 또는 매개 변수가있는 경우
[self performSelectorInBackground:@selector(otherMethodWithString:andData:) withObjects:string, data, nil];
등이 있습니다.
백그라운드 대기열을 실행하고 그 안에있는 사용자와 반복하는 방법을 설명하는 또 다른 예입니다.
- (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);
}
});
}
'i> 1000000'이 아니라'i <1000000'을 원한다. – rmaddy
고마워, 고쳐. – alexandresoli
숫자가 999 일 때 알림이 하나만 표시됩니다. – alexandresoli
다른 사람들처럼 GCD를 사용하는 것이 좋은 방법입니다.
작업을 취소 할 수 있도록하려면 (예 : 웹 리소스를로드하는 경우) NSOperation
의 서브 클래스를 만들고 isCancelled
을 확인하는 것이 좋습니다.
AFHTTPRequestOperationManager
)/관리 웹 요청을 만드는 않습니다.)
체크 아웃 애플 NSOperation
에 문서 및 NSOperation
들에 대한 자세한 내용은도 this tutorial on Ray Wenderlich's site.
이 작업을 수행하려면 확실히 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
});
});
- 1. 차단하지 않고 Java에서 notify()를 호출하려면 어떻게해야합니까?
- 2. Android - UI를 차단하지 않고 addView
- 3. ui를 차단하지 않고 DataReceived를 기다리십시오
- 4. 함수를 호출하지 않고 백그라운드에서 메서드를 호출하려면 어떻게해야합니까?
- 5. 개체에 '! ='메서드를 호출하려면 어떻게해야합니까?
- 6. 템플릿에서 메서드를 호출하려면 어떻게해야합니까?
- 7. UI를 차단하지 않고 일시 중지하는 방법
- 8. UI를 차단하지 않고 UITableView에서 데이터 새로 고침
- 9. 현재 UI를 차단하지 않고 Win32 창 만들기
- 10. UI를 차단하지 않고 TableView에 내용을로드하는 방법은 무엇입니까?
- 11. UI를 차단하지 않고 대화 상자를 닫는 방법
- 12. Java : UI를 차단하지 않고 스레드 결과를 기다리시겠습니까?
- 13. Qt 4.7에서 ui를 차단하지 않고 네트워킹하기
- 14. UI를 차단하지 않고 Silverlight 컨트롤 추가
- 15. 특정 스레드에서 메서드를 비동기 적으로 호출하려면 어떻게해야합니까?
- 16. C# .Net 4.5.1의 메서드에서 응답을 기다리지 않고 반복적으로 메서드를 호출하려면 어떻게해야합니까?
- 17. 다른 클래스의 메서드를 호출하려면 어떻게해야합니까?
- 18. 클래스없이 클래스 메서드를 호출하려면 어떻게해야합니까?
- 19. ViewController에서 버튼 메서드를 호출하려면 어떻게해야합니까?
- 20. Ruby에서 클래스의 메서드를 호출하려면 어떻게해야합니까?
- 21. 다른 컨트롤러에서 메서드를 호출하려면 어떻게해야합니까?
- 22. 루프에서 keyPressed() 메서드를 호출하려면 어떻게해야합니까?
- 23. ActionScript에서 RemoteObject 메서드를 호출하려면 어떻게해야합니까?
- 24. delegate의 parentDelegate에서 메서드를 호출하려면 어떻게해야합니까?
- 25. 파생 클래스에서 정적 메서드를 동적으로 호출하려면 어떻게해야합니까?
- 26. 정적 클래스를 참조하여 메서드를 호출하려면 어떻게해야합니까?
- 27. MVVM 규칙을 위반하지 않고 타사 컨트롤에서 메서드를 호출하려면 어떻게해야합니까?
- 28. form1의 새 인스턴스를 만들지 않고 form2의 form1 메서드를 호출하려면 어떻게해야합니까?
- 29. jQuery에서 MVC 작업 메서드를 호출하려면 어떻게해야합니까? .
- 30. WinForms는 UI를 블로킹하지 않고 비동기 메서드를 호출하는 동기 메서드를 실행합니다.
배경 스레드를 호출하십시오. –