作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我从事异步编程已有一段时间了,我想我理解了这些概念,但有一种情况我觉得我没有理解。查看代码:
-(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
是否存在。为了减轻您对嵌套异步方法的不安,我刚刚定义了一个新方法并调用了它。其余的更改只是格式化。最后,我认为这仍然提供相同的功能,并且更加紧凑且更易于理解。
我不确定 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);
}];
}
关于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/
我是一名优秀的程序员,十分优秀!