typedef 로 타입으로 만들기
typedef RETURN_TYPE (^NAME)(PARAMETERS...);
정의 예제(Definition Example):
typedef void (^SomeHandler)(NSError *error);
구현 예제(Implementation Example):
- (void)someWorkWithCompletion:(SomeHandler)handler {
...
}
이름이 리턴 타입 뒤에, 즉 중간에 끼어 있기 때문에 많이 헷갈린다.
바로 Parameter Field 로 정의하기
fieldName:(RETURN_TYPE (^)(PARAMETERS...))parameterName
정의 예제(Definition Example):
- (void)someMethodWithCompletion:(void (^)(NSData *data))completionHandler;
구현 예제(Implementation Example):
[someClass someMethodwithCompletion:^(NSData *data) {
...
}];
Property로 정의하기
RETURN_TYPE (^)(PARAMETERS...)
정의 예제(Definition Example):
@property (nonatomic, strong) void (^completionHandler)(NSData *data);
구현 예제(Implementation Example):
someClass.completionHandler = ^(NSData *data) {
...
};
프로퍼티로 정의하는 경우에도 이름이 가운데에 끼어서 좀 불안한(?) 모양세다.
변수로 생성하기
RETURN_TYPE (^BLOCK_NAME)(PARAMETER_TYPES...) = ^RETURN_TYPE(PARAMETERS...) { ... };
구현 예제(Implementation Example):
void (^someBlock)(NSData *) = ^void(NSData *data) {
...
};
[obj methodUsingBlock:someBlock];
[obj anotherMethodUsingBlock:someBlock];
만약 블럭을 여러 곳에서 공통적으로 쓴다면 변수 등으로 정의해서 참조 할 수 있다.
블럭 외부의 변수를 블럭 내부에서 세팅하기
Swift 클로져의 경우는 별 상관 없는데 Objective-C 블럭의 경우 외부 변수에 뭔가를 쓰는 것은 기본적으로 금지되어 있다. (즉 읽기만 가능하다.) 이를 쓰기 가능하게 풀려면 '__block' 을 쓰려는 변수 선언 앞에 달아주면 된다. 아래 코드는 GCD Dispatch 에서 사용하는 예이다.
__block int result = 0;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
....
result = [some workAndResult];
});
2020/05/29 - [iOS/Objective-C] - Detect permission of camera in iOS
2020/05/29 - [iOS/Swift] - WKWebView에서 history back 처리
2020/05/29 - [iOS/Objective-C] - OpenGL ES View Snapshot
2020/05/29 - [iOS/Objective-C] - Merge two different images in swift
2020/05/29 - [프로그래밍/C, C++] - Base64 encode / decode in C++
2020/05/29 - [OS/Mac OS X] - iPhone SDK location on hard drive
2020/05/29 - [iOS/Objective-C] - NSString <-> CBUUID 변환
2020/05/29 - [개발노트] - HTTP Content-Type
2020/05/28 - [iOS/Swift] - SEED 블록암호 알고리즘 CBC (Cipher Block Chaining) 예제
2020/05/28 - [개발노트] - HMAC SHA256
2020/05/26 - [iOS/Swift] - Array <-> Data 변환
2020/05/25 - [분류 전체보기] - UserAgent 추가
2020/05/25 - [iOS/Swift] - RSA 암호화 / 복호화
2020/05/25 - [iOS/Swift] - Base64 인코딩/디코딩
2020/05/19 - [AI/Algorithm] - Generic algorithm
'개발 > iOS' 카테고리의 다른 글
네비게이션바 투명 처리 (0) | 2020.05.29 |
---|---|
클로저(Closure) (0) | 2020.05.29 |
Detect permission of camera in iOS (0) | 2020.05.29 |
WKWebView에서 history back 처리 (0) | 2020.05.29 |
OpenGL ES View Snapshot (0) | 2020.05.29 |