要在@ 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
。沒有辦法讓你得到一個而不是完全可以使用。承認沒有取消機制,但你仍然可以延長這一點,以允許這樣做。
等一下,你只是說你想***阻止主線?!? – 2012-04-07 02:13:26
我同意,阻止** MAIN **線程阻塞您的應用程序... – Sirens 2012-04-07 02:15:17
最好創建一個新線程,然後添加一個UIActivityIndictor或其他東西來顯示網絡調用正在進行中。 – Otium 2012-04-07 02:19:33