2014-04-26 3 views
2

incrementCount:completion 메서드에서 블록을 전달하고 그 모양이 어떻게 되나요? self.count이 CounterClass에서 증가 된 후에 반환됩니까? 메서드에서 블록 매개 변수 (void(^)(void))callback;을 정의한 방법이 올바른지 확실하지 않습니다. 즉 반환 값이 있어야합니다.@selector()에 블록을 전달하는 방법

의 ViewController

[NSTimer scheduledTimerWithTimeInterval:3.0 
             target:self.counterClass 
             selector:@selector(incrementCount:completion:) 
             userInfo:nil 
             repeats:YES]; 

CounterClass는

-(void)incrementCount:(NSTimer *)timer completion:(void(^)(void))callback; 
    { 
     self.count += 1; 

    } 

답변

3

NSTimer는 타이머 인스턴스 자체되어야 파라미터가 존재하는 경우, 제로 또는 하나의 매개 변수를 사용하는 방법을 호출 할 예정이다.

따라서 하나의 블록 인 2 개의 매개 변수가있는 메소드를 사용할 수 없습니다.

대신 두 번째 매개 변수를 제거하고 메서드 구현에서 다른 메서드 나 블록을 호출하면됩니다. 블록은 클래스의 @property로 저장 될 수 있습니다.

+0

또는'NSTimer'의 사용자 정보 –

+0

@ScottBerrevoets를 사용하여, 당신은주의 조금 일을해야 당신이 블록을 복사해야하고로 'userInfo'는 단순히 유지됩니다 ... – Wain

+0

대단히 감사합니다. 좋아요. 원하는 메소드 (3 초마다)를 호출 할 CounterClass (매 3 초마다)의 다른 메소드를 호출 할 수 있습니다. 비트는 당신의 발언에 의해 잃어버린 "블록은 @pr 계급의 operty ". 나는 당신이 CounterClass의 속성이라고 생각하지만, 어떻게 CounterClass에서 ViewController (내 질문의 핵심)에서 self.count를 얻을 수 있습니까? CounterClass에서 self.count를 다시 얻으려면 블록을 전달해야한다고 생각했습니다. 당신이 의미하는 것을 보여주기 위해 약간 확장 할 수 있습니까? 시간이 있으면 고마워요 –

-1

당신은 userInfo에 블록을 추가 할 수 있습니다

[NSTimer scheduledTimerWithTimeInterval:3.0 target:self.counterClass selector:@selector(incrementCount:) userInfo:@{@"completion" : [yourBlock copy]} repeats:YES]; 

CounterClass

- (void)incrementCount:(NSTimer *)timer { 
    self.count += 1; 
    void (^completion)(void) = timer.userInfo[@"completion"]; 
} 

을 자세한 내용은 사전에 블록을 저장하기에 : 당신은 dispatch_after을 사용 할 수 blocks in nsdictionary?

+0

고맙습니다. 링크가 있더라도 약간 혼란 스럽습니다. 내가 호출하는 ViewController에서 CounterClass의 정보 (self.count)를 사용하고 싶습니다. 그걸하기 위해 내가 쓴 블록 복사본에 무엇을 넣을까요? 왜 이러는거야? 'void (^ completion) (void) = timer.userInfo [@ "completion"];'userInfo의 완성 블록을 void (^ completion) (void)에 할당하는 것처럼 보입니다. 내 일을 할 수있는 코드로 조금 확장 할 수 있습니까? 아마도 더 잘 이해할 수있을 것입니다. –

+0

타이머를 초기화 할 때 userInfo에 블록을 추가하려고합니다. 코드의 첫 번째 줄을 완전히 읽었는지 확인하십시오! – JonasG

+0

나는 당신의 참조를 보았다고 생각하지만 그것을 이해하지 못했다. 즉, incrementCount 메소드에서 self.count를 얻기 위해 어떤 블록을 추가 할 지 몰랐다. 나는 그 타이머를 얻는다. userInfo [@ "completion"]; 내가 제공하는 블록을 호출 할 것이지만 void (^ completion) (void)에 할당하는 것이 ViewController에서 self.count를 다시 얻는 방법을 이해하지 못합니다. 고마워요. 설명해 주셔서 감사합니다. 그렇지만 제가 명상하겠습니다. –

0

.

의 ViewController :

[self.counterClass incrementCountWithCompletion:^{ 
     // Your block code 
     NSLog(@"block code"); 
}]; 

CounterClass :

-(void)incrementCountWithCompletion:(void(^)(void))block; 
{ 
    dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)); 
    dispatch_queue_t queue = dispatch_get_main_queue(); // Choose whatever queue is approapriate to you 
    //Beware of retain cycles and use weak self pattern appropriately 
    dispatch_after(delay, queue, ^{ 
     self.count += 1;   
     block(); 
     [self incrementCountWithCompletion:block]; 
    }); 
} 
+0

이것은 NSTimer를 사용하지 않고도 할 수있는 방법이 있다는 것을 깨닫지 못했기 때문에 매우 흥미 롭습니다. 3 가지 질문 1) 그러나 self.count를 다시 얻을 수 있도록'// 당신의 블록 코드 '에 주석을 달아야 할 곳에 무엇을 넣을 지 보여 줄 수 있습니까? 2) 그리고 어디 실제로 self.count 증가 = 1 할 것이라고? 3) 동일한 메소드의 끝에 [self incrementCountWithCompletion : block]을 호출하면 반복 실행되지 않을 것입니다. –

+0

1) 잘 모르겠다는 것을 알기 때문에, 블록에서 리턴 매개 변수를 갖고 싶을 수도 있습니다. 질문을 수정하십시오. 2) 메소드로했던 것처럼 dispatch_after 블록에 넣을 수 있습니다. 3) 예, 반복 부분입니다. – lucianomarisi

관련 문제