0

저는 링크별로 다른 프로젝트에서 사용할 수있는 제네릭 클래스를 작성합니다.
얼마 지나지 않아 객체를 소유하고 클래스에 할당 된 리스너에 대한 메서드를 호출합니다.
하지만 때로는 해당 호출자가 사라질 수 있으므로 반환 메시지를 응용 프로그램 대리인에게 전달해야합니다. 여기iPhone - 제네릭 클래스 내에서 응용 프로그램 대리인을 참조하십시오.

내가 발신자에 대해 어떻게입니다 (호출자가 만든 하나이며 내 클래스의 인스턴스 소유) :

if ([self.responseListener respondsToSelector:@selector(serverAnswered:error:)]) { 
     // some job to construct the return object 

     [self.responseListener performSelector:@selector(serverAnswered:error:) withObject:response withObject:nil]; 
    } 

나는 responseListener 대신에 애플 대리자 클래스를 참조 할 수 있습니다 어떻게 발신자가 사라 졌나요?

답변

3

"발신자가 사라졌을 때"의 "발신자"가 무슨 뜻인지 잘 모르겠습니다. 어디서나 응용 프로그램 위임에 액세스 할 수있는 방법은 다음과 같습니다.

[UIApplication sharedApplication].delegate; 

당신이 특정 응용 프로그램의 위임에 고유 한 그 메소드를 호출해야하는 경우

, 당신은 그것을 가져 캐스트 할 필요가있다.

#import "MyAppDelegate.h" 

// ... 

MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate; 

업데이트 :

는 어떤 응용 프로그램 위임에 자신의 라이브러리 메소드를 호출하는 프로토콜을 사용합니다.

// The app delegate in your library users app 
#import "YourFancyLibrary.h" 

@interface MyAppDelegate : NSObject <UIApplicationDelegate, YourFancyLibraryDelegate> 

// In YourFancyLibrary.h, declare that protocol 
@protocol YourFancyLibraryDelegate 
- (void)myFancyMethod; 
@end 

// Refer to it in the guts of your library. 
id<YourFancyLibraryDelegate> delegate = [UIApplication sharedApplication].delegate; 
if (![delegate conformsToProtocol:@protocol(YourFancyLibraryDelegate)]) return; 
if (![delegate respondsToSelector:@selector(myFancyMethod)]) return; 
[delegate myFancyMethod]; 

당신이 당신의 도서관 이용자 구현해야하는 방법을 지정할로 API 명확하게하고, 대신 보내는 런타임 동적 메시지에 의존 컴파일시 검사에 허용하는 좋은 솔루션입니다 것입니다.

프로토콜을 건너 뛰고 직접 프로토콜을 호출 할 수도 있습니다.

+0

예, 앱 대리인에서 맞춤 메소드를 호출하고 싶습니다. 내 클래스는 일반적이고 다른 프로젝트에 포함될 수 있기 때문에 클래스는 포함 된 프로젝트에 사용되는 응용 프로그램 위임 클래스의 이름을 알지 못합니다. 클래스를 knocking하지 않고 두 번째 호출을 작성하는 방법이 있습니까? 앱 대리인의 이름입니다. – Oliver

+0

할 일은 라이브러리 사용자가 자신의 앱 델리게이트에 프로토콜을 구현하도록 요구하는 것입니다. 내 대답을 업데이트 할게. –

+0

동의합니다. 그러나 일부 특정 경우에만 호출되는 메서드를 구현하도록 응용 프로그램을 강제 적용 할 수 없습니다. 특정 호출이 일반 개체로 트리거 될 때 발생합니다. 제네릭 클래스에서 구현 된 다른 모든 메서드는 유용하지 않습니다. 따라서 앱 대리인이 해당 메소드를 구현했는지 확인하고 그렇지 않은 경우 세 번째 경로로 이동하는 것이 좋습니다. – Oliver

관련 문제