iOS-대리인
대리인의 예
객체 A가 작업을 수행하기 위해 객체 B를 호출한다고 가정 해 보겠습니다. 작업이 완료되면 개체 A는 B가 작업을 완료했음을 알고 필요한 작업을 수행해야합니다. 이것은 대표자들의 도움으로 이루어집니다.
위의 예에서 주요 개념은 다음과 같습니다.
A는 B의 대리자 객체입니다.
B는 A를 참조합니다.
A는 B의 대리자 메서드를 구현합니다.
B는 델리게이트 메소드를 통해 A에게 알립니다.
대리인 생성 단계
Step 1 − 먼저 단일보기 응용 프로그램을 만듭니다.
Step 2 − 그런 다음 파일 → 새로 만들기 → 파일 ...을 선택합니다.
Step 3 − 그런 다음 Objective C Class를 선택하고 다음을 클릭합니다.
Step 4 − 아래와 같이 NSObject로 하위 클래스를 갖는 SampleProtocol과 같이 클래스에 이름을 지정합니다.
Step 5 − 그런 다음 생성을 선택합니다.
Step 6 − SampleProtocol.h 파일에 프로토콜을 추가하면 업데이트 된 코드는 다음과 같습니다 −
#import <Foundation/Foundation.h>
// Protocol definition starts here
@protocol SampleProtocolDelegate <NSObject>
@required
- (void) processCompleted;
@end
// Protocol Definition ends here
@interface SampleProtocol : NSObject {
// Delegate to respond back
id <SampleProtocolDelegate> _delegate;
}
@property (nonatomic,strong) id delegate;
-(void)startSampleProcess; // Instance method
@end
Step 7 − 아래와 같이 SampleProtocol.m 파일을 업데이트하여 인스턴스 메서드를 구현합니다.
#import "SampleProtocol.h"
@implementation SampleProtocol
-(void)startSampleProcess {
[NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate
selector:@selector(processCompleted) userInfo:nil repeats:NO];
}
@end
Step 8 − 아래와 같이 오브젝트 라이브러리에서 UIView로 라벨을 드래그하여 ViewController.xib에 UILabel을 추가합니다.
Step 9 − 레이블에 대한 IBOutlet을 만들고 myLabel로 이름을 지정하고 다음과 같이 코드를 업데이트하여 ViewController.h에서 SampleProtocolDelegate를 채택합니다.
#import <UIKit/UIKit.h>
#import "SampleProtocol.h"
@interface ViewController : UIViewController<SampleProtocolDelegate> {
IBOutlet UILabel *myLabel;
}
@end
Step 10위임 메서드를 구현하고 SampleProtocol에 대한 개체를 만들고 startSampleProcess 메서드를 호출합니다. 업데이트 된 ViewController.m 파일은 다음과 같습니다.
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
SampleProtocol *sampleProtocol = [[SampleProtocol alloc]init];
sampleProtocol.delegate = self;
[myLabel setText:@"Processing..."];
[sampleProtocol startSampleProcess];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - Sample protocol delegate
-(void)processCompleted {
[myLabel setText:@"Process Completed"];
}
@end
Step 11다음과 같은 출력이 표시됩니다. 처음에 레이블은 SampleProtocol 개체에서 대리자 메서드를 호출하면 업데이트되는 "processing ..."을 표시합니다.