创建通过委托回调完成的任务队列

时间:2013-01-23 03:07:55

标签: iphone ios objective-c queue nsoperationqueue

我的应用程序允许人们分享他们通过Facebook,Twitter,电子邮件和短信创建的内容。每个选项都有一个相应的UISwitch。用户配置所有开关,然后按“完成”按钮。对于每个开关,如果设置为“ON”,我将触发一个适当的方法(shareViaSmsshareViaEmail等),它实例化本机iOS viewControllers以完成该类型的共享(TWTweetComposeViewController,MFMailComposeViewController,等等。)。这些viewControllers有委托回调来表示它们的完成,当一个完成时(有人发送或取消电子邮件撰写表),我需要触发他们想要使用的下一个。

我目前管理此代码的代码感觉很糟糕,我正在寻求更好的解决方案。如果用户打开所有4个选项,我调用第一个共享方法shareViaFacebook.具有委托方法,完成后,我检查下一个共享选项的UISwitch状态,如果它已打开,则调用它的共享方法,如果没有,检查下一个开关,依此类推。每个委托的完成方法遍历其余的开关,并负责调用下一个共享方法。您可以想象,添加新选项需要更改大量代码并修改许多if / else条件。

我该如何改进?我希望能够简单地查看所有UISwitch,如果设置为“ON”,则将相应的共享方法(shareViaSMS)添加到某个队列,然后运行该队列并使用下一个共享方法在前一个完成时自动调用。我正在努力,因为如前所述,完成是异步的,并通过委托回调宣布。

1 个答案:

答案 0 :(得分:1)

您需要一个“经理”对象,它接受一个“请求”对象,该对象将包含启动您想要的特定请求的所有必要信息(服务名称,文本,标题等)。

“manager”对象包含一系列任务,您将使用请求对象加载这些任务,并且必须通过使用委托来使用递归,并在完成后立即弹出请求。

委托应该在管理器中调用一个方法,例如:

如果请求成功完成,则弹出堆栈顶部并再次调用管理器执行堆栈请求方法的顶部。

如果请求失败,请停止并发送消息。

如果堆栈为空,则所有请求都已执行。

当然,您的经理必须拥有适当的代码来处理每种类型的请求。

如果您有这种架构,添加新服务就像添加代码来管理对管理器对象的请求类型一样简单。

顺便说一句,这是您可以创建队列的众多方法之一,我建议这一点,因为它在语言上独立且易于理解。