는 @의 DANH의 대답에 약간의 확장하려면, 당신이 그것을 모두 끝낼 때까지 개체에 대한 포인터가 안된다고 말하고 싶지만. 예를 들면 :
[MyObject makeObjectWithID:123 completion:^(MyObject *object, NSError *error) {
if (object == nil) {
NSLog(@"error creating object: %@", error);
} else {
NSLog(@"created object: %@", object);
}
}];
그리고 생성 방법은 다음과 같이 될 것이다 :
원칙적으로
+ (void)makeObjectWithID:(NSInteger)objectID completion:(void(^)(MyObject*,NSError*))handler {
handler = Block_copy(handler);
dispatch_async(dispatch_get_global_queue(0,0), ^{
MyObject *object = [[MyObject alloc] initWithID:objectID];
NSError *error = nil;
BOOL succeeded = [object doTheExpensiveAndBlockingSetupThingWithError:&error];
if (succeeded == NO) {
[object release], object = nil;
}
dispatch_async(dispatch_get_main_queue(), ^{
handler([object autorelease], error);
});
});
Block_release(handler);
}
, 나는 안전 당신이 API가 덜 가능성이 당신이 스크류 수 있습니다 만들 것을 발견 뭔가가. 이 방법은 부분적으로 생성 된 MyObject
에 대한 포인터가 없기 때문에 안전합니다. 당신이 그것을 얻을 수있는 방법이 없으며 이 아니라을 완전히 사용할 준비가되어 있어야합니다. 취소 메커니즘은 없지만이를 허용하기 위해이 기능을 확장 할 수 있습니다.
잠깐, 당신은 *** 당신이 *** 메인 스레드를 차단하고 싶다고 말 했나요?!? –
** MAIN ** 스레드가 앱을 막아 버리는 것을 동의합니다 ... – Sirens
새 스레드를 만든 다음 UIActivityIndictor 또는 네트워크 통화가 진행 중임을 나타내는 내용을 추가하는 것이 좋습니다. – Otium