2013-04-07 2 views
7

NSDictionary 클래스에서 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)과 같은 클래스에 메서드를 만들고 싶습니다.NSDictionary 클래스의 enumerateObjectsUsingBlock과 같은 블록에서 중지 조건을 사용하는 방법은 무엇입니까?

블록 사용에 대한 약간의 지식이 있지만 enumerateObjectsUsingBlock 함수가 사용하는 정지 조건을 만드는 방법을 파악하지 못했습니다. 어떤 제안?

답변

13

stop 플래그는 다음과 같이 사용된다 :

[coll enumerateUsingBlock:^(id o, NSUInteger i, BOOL *stop) { 
     if (... check for stop ...) { 
      *stop = YES; 
      return; 
     } 
}]; 

때 열거 블록 복귀 수집 검사 *stop. YES이면 열거가 중지됩니다.

반환 값과 반대되는 방식으로이 방법을 구현합니다. 이는 오버 헤드가 발생하는 블록 반환 값을 확인하지 않고 동시 열거 형을 허용하기 때문입니다. 나는. 동시 열거 형에서 컬렉션은 dispatch_async() 수의 동시 반복이 가능하며 주기적으로 *stop을 확인합니다. *stopYES으로 전환 될 때마다 더 많은 블록 일정을 중지합니다 (이 이유 때문에 stop 플래그가 강제 중지되지 않으며 일부 지정되지 않은 반복 횟수가 계속 비행 할 수 있습니다). 당신의 반복자에

, 당신은 할 수 있습니다

BOOL stop = NO; 
for(...) { 
    enumerationBlock(someObj, someIndex, &stop); 
    if (stop) break; 
} 
+0

감사합니다 뭔가를 할 수있는 전달이 완벽하게 작동합니다. 이 질문에 대한 해결책은 다음에서 찾을 수 있습니다. http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-Objective-C –

6

다음 코드는 매개 변수로 블록을 소요하는 방법을 정의하고 shouldStop이 블록 NO로 설정 될 때까지 실행을 유지합니다.

설명은 매우 간단합니다. 블록은 몇 가지 매개 변수를 사용하는 함수입니다. 이 경우 매개 변수로 우리가 소유 한 변수 BOOL에 대한 포인터를 전달합니다. 그렇게함으로써 우리는 블록이 그 변수를 설정할 수있게하고 -이 경우에는 - 루프가 멈추어야한다는 것을 나타냅니다. 이 시점에서

는, 블록이

[self myMethod:^(BOOL *stop) { 
     if (arc4random_uniform(1)) { 
      *stop = YES; 
     } 
}]; 
관련 문제