-
블록은 Objective-C 에서 closure라는 abstract concept 를 구현한 것.
closure란? function 을 environment 와 함께 저장하는 record
일반적인 객체라고 생각하면 된다. isa 포인터도 가진다. 단순한 함수 포인터를 대신하는 것. -
블록을 실제로 사용하는 방법
return_type ^(block_name)(params) = ^(params) {
return_type;
}
이 외에도 많이 있다
시간이 오래 걸리는 작업(ex. 네트워크)을 할 때, 이 작업이 끝날 때까지 ui thread 가 기다리고 있는 건 바람직하지 않다.
특정 상황에서 앱이 특정 시간동안 응답하지 않으면 강제 종료가 될 것이다.
- system watchdog
https://ko.wikipedia.org/wiki/%EC%9B%8C%EC%B9%98%EB%8F%85_%ED%83%80%EC%9D%B4%EB%A8%B8
사람이 쉽게 접근해서 고치기 힘든 컴퓨터에 대해 오작동을 감지하고 복구하기 위한 전자 타이머
따라서 시간이 오래 걸리는 작업은 비동기로 작업하고, 작업이 끝났을 때 알림을 받고 싶을 것이다.
// Using the network fetcher
@implementation EOCClass {
EOCNetworkFetcher *_networkFetcher; // self -> fetcher
NSData *_fetchedData;
}
- (void)downloadData {
NSURL *url = [[NSURL alloc] initWithString:@"http://www.example.com/something.dat"];
_networkFetcher = [[EOCNetworkFetcher alloc] initWithURL:url];
- sync 는 current thread 를 작업이 다 끝날 때까지 block 한다
- async 는 current thread 를 건드리지 않는다. 새로운 thread를 따로 만들거나 해서 실행시킨다.
그러니 어느 쪽이 먼저 실행될 지는 알 수 없다.
- GCD 이전엔 두 가지 방법이 있었다.
- 내장된 동기화 블록 사용하기 -> 남용하면 위험하다. 모든 블록이 서로를 동기화할 것이다.
- NSLock 객체를 직접 사용하기
- 하지만 둘 다 문제가 있다. 데드락에 대한 처리가 힘들기 때문.
싱글턴 디자인 패턴은 흔히 사용되는 패턴이지만 thread-safety 에 대한 논쟁이 있다.
그래서 동기화 블록으로 둘러쌓기도 한다.
+ (id) sharedInstance {
static EOCClass *sharedInstance = nil;
@synchronized(self) {
if (!sharedInstance) {
sharedInstance = [[self alloc] init];
}
OlderNewer