2012-06-16 1 views
0

objective-c 블록의 콜백 매개 변수를 사용하여 직접 호출하려는 인스턴스 메서드가 있습니다. 콜백에서 간단한 1 라이너 이상을 수행해야 할 때이 접근법을 선호합니다. 여기 objective-c 블록을 선언 할 때 인스턴스 메서드를 참조 할 수 있습니까

내가 HTTP 요청은 내가 설정 전화를 할 수

- (void)initFooAndDoStuff { 
    Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
     // do stuff 
    }]; 
} 

//this is the instance method I'd like to invoke instead of an inline function 
- (void)callBackWithHttpResponse:(NSData *)response { 
    // do stuff ... assuming it's more complex than a 1 liner that is 
} 

말할 수 후에 다시 내가 JSON을 구문 분석 할 수 호출 어떤 종류의 승/클래스를 초기화하기 ... 기본 설정입니다 다시 뭔가를 인라인 않는 (그러나 다시 더 복잡한 물건은 아마도 독립 실행 형 인스턴스 메소드에 좋을 것이다) 나는 다음과 같은 인스턴스 방법을 사용할 수 있습니다

Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
    NSLog(@"foo"); 
}]; 

하지만 w 조금 긴 느낌 inded. 어떤 식 으로든 이것을 잘라낼 수 있습니다.

Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
    [self callBackWithHttpResponse:response]; 
}]; 
+1

왜 대리인을 사용하지 않습니까? –

+0

나는 당신이하려는 것을 이해하지 못합니다. 하나의 블록을 선언하고 매번 다시 인라인 할 필요없이 반복해서 복사하거나 재사용하고 싶습니까? –

+0

블록은 일반적으로 이전의 target-and-selector 기법보다 번거롭지 않습니다. 마지막 코드 스 니펫은 매우 간결하고 간단합니다. target-and-selector 접근법을 원한다면,'Foo'가 그렇게 작동하도록 설계하십시오. –

답변

2

, 당신은뿐만 아니라 단지 방법은 전체 블록을 반환 할 수도 있습니다 사용하는 장소는 좀 더 간결합니다.

Foo *foo = [[Foo alloc] initWithCallback:[self httpResponseHandler]]; 
+0

최고! 이것은 내가 찾고 있었던 바로 그 것이다! (우습게 오늘 아침에 ocmock과 관련된 몇 가지 문제가 발생하여 끝났습니다 .CoOSi의 멘토링 **은 커뮤니티에서 자신을 좋아하는 개발자가 더 필요합니다.) –

+0

나는 그것이 단순화 된 방법을 잘 모르겠습니다. - 복잡성 측면에서 더 많은 측면 이동 - 그러나 그것은 확실히 완벽하게 유효합니다 (유용합니다 - 나는 비슷한 것을 항상합니다). Upvote! – bbum

+0

@bbum 단순화 자체가 아니라 구현에 재사용 할 수있는 방법에 따라 달라집니다. 인라인 블록에 포함 된 콜백 메소드는 전반적으로 유연합니다. 그러나 나는 관련성이있는 곳에서 [설계 연습으로 메소드에서 블록을 반환] (http://twobitlabs.com/2012/05/block-initialization-for-testability-and-reuse)하고 싶습니다. –

1
Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
    [self callBackWithHttpResponse:response]; 
}]; 

OK - 그대로 읽을 꽤 꿰매.

이제 다른 방에 가서 6 개월에서 1 년 동안이 프로젝트를 보지 않은 시뮬레이션을 위해 벽돌로 머리를 세 번 치십시오.

이제 코드를 다시 읽으십시오.

아직도 읽을 수있는가요?

코드의 내용이 정확히 표시 될 때 약간 자세한 정보가 표시됩니다. 켄 토머스 (Ken Thomases)가 제안한대로 목표/행동 패턴을 적용 할 수는 있지만 다른 곳에서는 더 복잡 할 것입니다.

callback 대신에 더 구체적으로 변경합니다. 나는. 콜백 정말 완료 핸들러 인 경우 : 다음

-(void (^)(NSData *))httpResponseHandler { 
    return ^(NSData *responseData){ 
     // do something with responseData 
    }; 
} 

: 당신이 방법의 구현을 넣어려고하는 경우에

Foo *foo = [[Foo alloc] initWithHTTPResponseCompletionHandler:^(NSData * response){ 
    [self httpResponseCompletionHandler:response]; 
}]; 
+0

내가 동의 할 것입니다 - 다른 쪽 끝의 복잡성은 웹 서비스 클래스를 할당/초기화 할 때 이미하고있는 것 같습니다.나는 단지 내가 객관성 -c 블록 신택스 (답장을 보내 주셔서 고맙다)에 상당히 새로운 것에 대해 내가 가지고있는 다른 옵션들이 무엇인지보기에 호기심이 많았다. –

관련 문제