gpt4 book ai didi

ios - Objective-C 中的异步编程 : I feel like there is repetitive code here and I don't know what I can do about it

转载 作者:可可西里 更新时间:2023-11-01 05:55:03 25 4
gpt4 key购买 nike

我从事异步编程已有一段时间了,我想我理解了这些概念,但有一种情况我觉得我没有理解。查看代码:

-(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 的成功 block 中无条件地调用 handler(),因为情况 #3 需要它的异步方法才能成功或失败才能调用它。

谁能推荐一种模式来帮助解决这个问题?在处理像这样的嵌套异步操作时,我感到最不舒服。

最佳答案

我所做的最大改变是定义了一个 block 变量,负责多次检查 handler 是否存在。为了减轻您对嵌套异步方法的不安,我刚刚定义了一个新方法并调用了它。其余的更改只是格式化。最后,我认为这仍然提供相同的功能,并且更加紧凑且更易于理解。

我不确定 asyncMethod12 是否是对象,所以我只是假设它们是在同一个类中定义的方法并插入了 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);
}];
}

关于ios - Objective-C 中的异步编程 : I feel like there is repetitive code here and I don't know what I can do about it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19456186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com