2010-02-06 71 views
4

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

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

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

常常有一个给定的操作的多个实例(比如FBRequest)使用相同的回调。这意味着我必须将条件子句放入回调处理程序中才能知道哪些操作已完成。

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

回答

10

我不熟悉Facebook SDK,但是您可以创建一个子类,为您需要Facebook的每个特定任务实现FBRequestDelegate协议(如果它的调用方式如此)。这样,您就说5个类实现- fbOperationFinished:而不是一个类,其中有5个不同的执行路径由if s或switch es隔开。

+0

+1是的,这是做它的方式。如果任务足够离散以需要大量分支,则它们足够分散以便被封装在自己的类中。请记住,代表附加到实例,而不是类。根据需要,您可以拥有尽可能多的委托实例。 – TechZen 2010-02-06 14:07:18

+0

问题在于任务本身并不足够离散,需要解耦成单独的类。如果代码是同步的,则几乎不会有分支。我很犹豫要创建多个类并共享成员变量,以获得体面的程序流。 – zoul 2010-02-06 15:02:11

+0

...但是,是的,你说得对,这会做。 – zoul 2010-02-06 15:13:57

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... 

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

+1

@ TechZen:“块”是苹果对“闭包”的一个奇怪术语。 – kennytm 2010-02-06 14:57:58

+0

对不起,我在'关闭'和'块'之间犹豫了一秒钟。有谁知道他们为什么选择另一个词来表达已经被广泛接受的名字? – zoul 2010-02-06 15:00:59

+0

这与块没有任何关系。 – 2010-02-06 15:40:51

3

没有必要继承Facebook API对象。我强烈建议不要这样做。

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

这比Cocoa框架的风格更清洁和更多。

0

我会把这些请求放到一个NSOperationQueue中,这会让每一个都不同,并且同时节流你一次有多少活动。

你只需要请求包成的NSOperation对象(Facebook的API可能已经?)