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

Iphone 创建通过委托回调完成的任务队列,iphone,ios,objective-c,queue,nsoperationqueue,Iphone,Ios,Objective C,Queue,Nsoperationqueue,我的应用程序允许人们分享他们通过Facebook、Twitter、电子邮件和短信创建的内容片段。每个选项都有相应的UISwitch。用户配置所有交换机,然后按下“完成”按钮。对于每个开关,如果设置为“开”,我会启动一个适当的方法(shareViaSms,shareViaEmail,等等),该方法实例化本机iOS ViewController以完成该类型的共享(tweetComposeViewController、MFMailComposeViewController等)。这些viewcontro

我的应用程序允许人们分享他们通过Facebook、Twitter、电子邮件和短信创建的内容片段。每个选项都有相应的UISwitch。用户配置所有交换机,然后按下“完成”按钮。对于每个开关,如果设置为“开”,我会启动一个适当的方法(
shareViaSms
shareViaEmail
,等等),该方法实例化本机iOS ViewController以完成该类型的共享(tweetComposeViewController、MFMailComposeViewController等)。这些viewcontroller有代理回调来表示它们的完成,当其中一个完成时(有人发送或取消电子邮件撰写工作表),我需要启动下一个他们想要使用的

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

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

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

“manager”对象包含一组任务,您将使用requests对象加载这些任务,它必须使用递归性,使用委托并在完成请求后立即弹出请求

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

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

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

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

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

如果您有这种体系结构,那么添加一个新服务就相当于向manager对象添加代码来管理该类型的请求


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

这一切都很有意义。不过有两个问题。1) 当您说“代理人应调用经理内部的方法”时,您是指各自股票期权的每位代理人吗?像MFMailComposeDelegate和MFMessageComposeDelegate?2) 当我的所有逻辑现在都封装在manager对象中时,如何将viewController(如MFMailComposeViewController)推送到堆栈上。我认为您只能从现有的viewController推送新的viewController。我的经理是否应该保留对实例化它的viewController的引用?对于第一个问题,是的,每个股票期权都有自己的回调,此回调应该调用经理对象,以便队列可以继续。对于你的第二个问题,你说什么似乎是最好的解决方案,这实际上取决于你执行的任务。如果需要展示新的控制器,那么经理必须有一个将展示它的VC的参考。