に@ 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