这是很难解释的。我正在创建一个串行队列来处理我的应用程序中的某些工作。想象一下,我做这样的事情:
dispatch_async(myQueue, { () -> Void in
self.SendSMS();
});
dispatch_async(myQueue, { () -> Void in
self.SendEmail();
});
现在,我想做的只是在委托(SendSMS委托)完成工作之后才调用self.SendEmail。
有没有简单的方法可以做到这一点?
非常感谢
最佳答案
假设SendSMS
是一个异步方法,我建议更改SendSMS
以使用完成处理程序闭包:
// define property to hold closure
var smsCompletionHandler: (()->())?
// when you initiate the process, squirrel away the completion handler
func sendSMSWithCompletion(completion: (()->())?) {
smsCompletionHandler = completion
// initiate SMS
}
// when the SMS delegate method is called, call that completion closure
func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {
// do whatever you want when done
// finally, call completion handler and then release it
smsCompletionHandler?()
smsCompletionHandler = nil
}
因此,您可以这样称呼它,将
sendEmail
放在sendSMS
的完成闭包中:self.sendSMSWithCompletion() {
self.sendEmail()
}
我不知道您的
sendSMS
和sendEmail
在做什么,但是如果您要调用MessageUI
框架,通常会在主队列中执行此操作。但是,如果您确实需要在专用队列上执行上述操作,请随时将其发送到该队列。但是希望这可以说明以下概念:(a)供应完成处理程序关闭; (b)保存它,以便您的代表可以调用它; (c)调用委托时,请使用该闭包属性,然后将其重置。