要在@ 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