ios – Objective-C中的异步编程:我觉得这里有重复的代码,我不知道我能做些什么呢

我一直在使用异步编程一段时间,我想我理解这些概念,但有一种情况我觉得我没有得到.看看代码:

-(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);
    }];
}
点赞