我一直在使用异步编程一段时间,我想我理解这些概念,但有一种情况我觉得我没有得到.看看代码:
-(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需要它的异步方法才能成功或失败才能被调用.
任何人都可以建议一种模式来帮助吗?在使用像这样的嵌套异步操作时,我感到最不舒服.
最佳答案 我做的最大的改变是定义一个块变量,它负责检查处理程序是否存在的多重检查.为了减轻你对嵌套异步方法的不安,我刚刚定义了一个新方法并调用它.其余的更改只是格式化.最后,我认为这仍然提供相同的功能,并且更紧凑,更容易遵循.
我不确定asyncMethod1和2是否是对象,所以我只是假设它们是在同一个类中定义的方法并插入self.
- (void)callAsyncMethod2WithHandler:(void (^)(int result))handler {
[self asyncMethod2Success:^(NSDictionary *dict) {
handler(1);
} failure:^(NSError *error) {
handler(2);
}];
}
- (void)someMethod:(void (^)(int result))handler {
void (^safeHandler)(int) = ^void (int theResult) {
if (handler) handler(theResult);
};
[self asyncMethod1Success:^(NSDictionary *dict) {
NSString *someValue = dict[@"someKey"];
if ([someValue isEqualToString:kString1]) {
// some code
safeHandler(1);
} else if ([someValue isEqualToString:kString2]) {
safeHandler(1);
} else if ([someValue isEqualToString:kString3]) {
[self callAsyncMethod2WithHandler:safeHandler];
}
} failure:^(NSError *error) {
safeHandler(2);
}];
}