这是很难解释的。我正在创建一个串行队列来处理我的应用程序中的某些工作。想象一下,我做这样的事情:

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()
}

我不知道您的sendSMSsendEmail在做什么,但是如果您要调用MessageUI框架,通常会在主队列中执行此操作。但是,如果您确实需要在专用队列上执行上述操作,请随时将其发送到该队列。但是希望这可以说明以下概念:(a)供应完成处理程序关闭; (b)保存它,以便您的代表可以调用它; (c)调用委托时,请使用该闭包属性,然后将其重置。

10-02 18:37