我正在使用Facebook iPhone SDK编写一个简单的应用程序。 Facebook代码主要是异步的,我开始操作并在委托调用中异步接收响应:
- (void) doSomething {
[FBSomething startOperationWithDelegate:self];
}
- (void) fbOperationFinished: (FBSomething*) operation {…}
通常会有更多使用相同回调的给定操作(例如FBRequest
)的实例。这意味着我必须将一个条件子句放入回调处理程序,以了解哪些操作已完成。
这导致了凌乱,一种“异步意大利面条代码”怪物,因为代码充满了条件,并且几乎不可能看到程序流逻辑。有没有更好的方法来编写这样的代码? (遗憾的是我们在iPhone上没有块。)我想过引入一个简单的状态机,但我不确定它会有所帮助。
答案 0 :(得分:10)
我不熟悉Facebook SDK,但您可以创建一个子类,为您需要Facebook的每个特定任务实现FBRequestDelegate
协议(如果它被称为那样)。这样,您可以说实现- fbOperationFinished:
的5个类而不是一个具有由if
或switch
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可能已经存在?)