私はしばらく非同期プログラミングに取り組んできましたが、概念は理解していると思いますが、得られていないように感じる特定のシナリオがあります。コードをチェックしてください:
-(void)someMethod:completionHandler:(void (^)(int result))handler
{
[anotherObject asyncMethod1Success:^(NSDictionary *dict)
{
if ([dict[@"someKey"] isEqualToString:kString1])
{
// some code
if (handler)
{
handler(1);
}
}
else if ([dict[@"someKey"] isEqualToString:kString2])
{
// some different code
if (handler)
{
handler(1);
}
}
else if ([dict[@"someKey"] isEqualToString:kString3])
{
// even different code
[anotherObject asyncMethod2Success:^(NSDictionary *dict)
{
if (handler)
{
handler(1);
}
}
failure:^(NSError *error)
{
if (handler)
{
handler(2);
}
}];
}
}
failure:^(NSError *error)
{
if (handler)
{
handler(2);
}
}];
}
基本的に、ハンドラーは、エラーが発生した場合、または両方の非同期操作が正常に返された場合に呼び出される必要があります。ここには反復的なコードがあるように感じますが、それに対して何ができるかわかりません。asyncMethod1 の成功ブロックで無条件に handler() を呼び出すことはできません。これは、ケース #3 では非同期メソッドが呼び出されるために成功または失敗する必要があるためです。
ここで役立つパターンを提案できる人はいますか? このようなネストされた非同期操作を操作するとき、私は最も不快に感じます。