2014-04-08 2 views
3

콜백 블록을 저장하고 속성 또는 사전에 블록을 저장하지 않고 나중에 실행하는 표준 방법이 있는지 알아 내려고하고 있습니다.iOS : 콜백 블록 저장 및 실행

다음과 같은 시나리오를 상상해 :

나는 클래스가을의이 MyApiClient을 가정 해 봅시다과 요청이 완료되면 완료 블록이 호출 getListOfBooksWithCompletionHandler:(void (^))completion라는 방법을 가지고 있습니다. 지금까지 그렇게 좋았어.

내부적으로 MyApiClient은 완료를 제공하지 않지만 호출을 위임하기 만하는 다른 API의 일부 메소드를 호출해야합니다.

이것은 다른 API에서 각 대리자 메서드가 호출 될 때까지 어딘가에 콜백 블록을 저장해야한다는 것을 의미합니다.

나는 이전 프로젝트에서 NSMutableDictionary에 콜백 블록을 저장하고 일종의 고유 식별자를 사용하여 위임 호출 중에 찾아 냈습니다.

내게는이므로 이 불필요한 상용구 코드처럼 느껴집니다. 더 좋은 방법/API가 있습니까? 어쩌면 어떤 ID로 블록을 저장하고 블록에 호출을 보내는 신호를 트리거 할 수있는 메커니즘일까요?

Google이나 Apple의 설명서를 사용하여 이것에 관해 많이 알 수 없습니다. 어떤 아이디어?

+0

왜 블록을 저장하기 위해 속성을 사용하지 않으므로 클래스 확장에 추가 할 수 있습니까? – Greg

+0

그 문제는 한 번에 하나의 요청 만 허용한다는 것입니다. 첫 번째 요청이 아직 끝나지 않은 상태에서 두 번째 요청을 트리거하면 이전 콜백 핸들러를 덮어 쓰게되어 많은 문제가 발생합니다. 앞서 말했듯이, 블록을 저장하기 위해 사전을 사용하여이 문제를 해결했지만 더 나은 방법이 있는지 알아 보는 것이 중요합니다. – BastiBen

+0

다음 블록 대신 대리자를 사용하면 어떨까요? –

답변

0

난 당신이 클래스

@property (nonatomic, copy) void (^completionHandler)(parameters ...); 

의 속성에 완료 블록을 저장하는 것이 좋습니다 및 각 요청에 대한 별도의 인스턴스를 만들 것입니다. 그런 다음 각 인스턴스는 블록 과 특정 요청에 대한 다른 상태 정보를 보유 할 수 있습니다. 또한 사용중인 "기타 API"에 대한 대표자 인 역할을 할 수 있습니다.

+0

클래스가 관리자 역할을 가지며 종속성 및 캐시를 관리 할 때 싱글 톤처럼 단 한 번만 존재하기 때문에 이는 적합하지 않습니다. 위의 내 의견을 참조하십시오. – BastiBen

+0

@badcat : 귀하의 의견을 읽었지만 각 요청에 대해 별도의 인스턴스를 만드는 것이 최상의 솔루션이라고 생각합니다. 해당 관리자보다 하나의 관리자가있는 경우 각 요청에 대한 도우미 클래스의 인스턴스를 만들 수 있습니다. "다른 API"에 대한 별도의 델리게이트 객체를 갖는 것이 내 의견으로는 크게 단순화합니다. –

+0

@badcat : 아마도 관리자 클래스가하는 일에 대해 더 많은 정보를 제공 할 수 있습니다. –