0

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

我当前管理这个的代码感觉很笨拙,我正在寻找更好的解决方案。如果用户打开所有 4 个选项,我调用第一个共享方法shareViaFacebook.,它有一个委托方法,完成后,我检查下一个共享选项的 UISwitch 状态,如果它打开,调用它的共享方法,如果没有,检查下一个开关,以此类推。每个委托的完成方法循环通过剩余的开关,并负责调用下一个共享方法。可以想象,添加一个新选项需要更改大量代码并修改许多 if/else 条件。

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

4

1 回答 1

1

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

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

委托应调用管理器内部的方法,该方法执行以下操作:

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

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

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

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

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

顺便说一句,这是创建队列的众多方法之一,我建议使用这种方法,因为在我看来它与语言无关且易于理解。

于 2013-01-23T03:31:08.877 回答