私があなたを理解している場合、MyObjectはセットアップを完了するために非同期リクエストを行っているため、呼び出し元は、非同期セットアップが完了するまで、作成したインスタンスの準備ができていると想定できません。
これを解決する方法は、呼び出し元にセットアップが完了したことを知らせることです。呼び出し元を MyObject のデリゲートにする、または完了時に MyObject に NSNotification をポストさせるなど、いくつかの優れたアプローチがありますが、呼び出し元のコードが読みやすくなることが多いため、ブロックを好む傾向があります。
それを行う方法は次のようになります... MyObject.h:
typedef void (^CompletionBlock)(id result, NSError *error);
+ (MyObject *)createWithId:(NSInteger)anId completion:(CompletionBlock)completion;
私のオブジェクトは、必要に応じて (@property(copy...) を使用して) ブロックを ivar として保持し、セットアップが完了したときにそれを呼び出すことができます。
呼び出し元は次のようになります。
// do something to indicate activity, like show an activity indicator
MyObject *newObject = [MyObject createWithID:123 completion::^(id r, NSError *e) {
// hide the activity indicator
if (!error) {
// code here gets executed when newObject is ready... update the ui accordingly
}
}];
// code here gets executed right away, and should not assume that newObject is ready