我如何处理异步意大利面条代码?

时间:2010-02-06 12:46:59

标签: iphone objective-c asynchronous

我正在使用Facebook iPhone SDK编写一个简单的应用程序。 Facebook代码主要是异步的,我开始操作并在委托调用中异步接收响应:

- (void) doSomething {
    [FBSomething startOperationWithDelegate:self];
}

- (void) fbOperationFinished: (FBSomething*) operation {…}

通常会有更多使用相同回调的给定操作(例如FBRequest)的实例。这意味着我必须将一个条件子句放入回调处理程序,以了解哪些操作已完成。

这导致了凌乱,一种“异步意大利面条代码”怪物,因为代码充满了条件,并且几乎不可能看到程序流逻辑。有没有更好的方法来编写这样的代码? (遗憾的是我们在iPhone上没有块。)我想过引入一个简单的状态机,但我不确定它会有所帮助。

4 个答案:

答案 0 :(得分:10)

我不熟悉Facebook SDK,但您可以创建一个子类,为您需要Facebook的每个特定任务实现FBRequestDelegate协议(如果它被称为那样)。这样,您可以说实现- fbOperationFinished:的5个类而不是一个具有由ifswitch es分隔的5个不同执行路径的类。

答案 1 :(得分:3)

无需继承Facebook API对象。我强烈建议不要这样做。

所有facebook对象都有一个userInfo字段,您可以使用该字段存储请求特定信息。因此,您可以在其中存储内容以识别请求,甚至可以引用对象来处理请求。

这更加清晰,更符合Cocoa框架的风格。

答案 2 :(得分:1)

  

(遗憾的是我们没有阻挡   iPhone。)

您可以使用不带符号的花括号创建可视块。例如,动画块没有可视结构,但您可以像这样提供它:

// ...some code
[UIView beginAnimations:@"selectionAnimation" context:nil];{
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:0.1];
    [UIView setAnimationRepeatCount:1];
    [UIView setAnimationRepeatAutoreverses:YES];
    { //start properties to animate
        self.transform=CGAffineTransformScale(self.transform, 1.1, 1.1);
    } // end properties to animate
    [UIView commitAnimations];
}
// more code...

这不是一个逻辑块,但总比没有好。您也可以使用它们来折叠代码。我用它们来隐藏断言或调试代码。

答案 3 :(得分:0)

我会将这些请求放入NSOperationQueue中,这会使每个请求保持不同,并且还会限制您一次有多少活动。

您只需将请求包装到NSOperation对象(Facebook API可能已经存在?)