Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift串行调度块仅在委托后完成_Ios_Swift_Asynchronous - Fatal编程技术网

Ios Swift串行调度块仅在委托后完成

Ios Swift串行调度块仅在委托后完成,ios,swift,asynchronous,Ios,Swift,Asynchronous,这很难解释。我正在创建一个串行队列,用于处理我的应用程序中的一些工作。想象我做了这样的事情: dispatch_async(myQueue, { () -> Void in self.SendSMS(); }); dispatch_async(myQueue, { () -> Void in self.SendEmail(); }); 现在,我想做的是仅在代理(SendSMS代理)完成

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

dispatch_async(myQueue, { () -> Void in
            self.SendSMS();
            });

dispatch_async(myQueue, { () -> Void in
            self.SendEmail();
            });
现在,我想做的是仅在代理(SendSMS代理)完成其工作后调用self.SendEmail

有没有一个简单的方法可以做到这一点


非常感谢

一种方法是:

dispatch_async(myQueue, { () -> Void in
        self.SendEmail();
        });
在委托的末尾。但我不知道这是不是唯一的办法


干杯

是的,您可以这样做,在接下来的步骤中:

// create tasks group handle
let taskGroup = dispatch_group_create()
let mainQueue = dispatch_get_main_queue()

// write your blocks in needed order
dispatch_group_async(taskGroup, mainQueue) { [weak self] in
    // execute your code
    // don't forget to use self with optional, i.e.: self!.property or function
    self!.SendSMS()
}

dispatch_group_async(taskGroup, mainQueue) { [weak self] in
    self!.SendEmail()
}

// and of course you need to catch completion of this task group
dispatch_group_notify(taskGroup, mainQueue) {
    println("All work is done, milord!")
}
UPD.上述解决方案是关于无顺序异步执行的,如所述,其中一个可以在声明的顺序之前完成。您需要使用依赖项作为连续执行的解决方案。我说的是多线程中的排序,而不是完成闭包或执行器模式。 请注意,有不止一个案例可以这样做。其中之一——如下所示:

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) {
    dispatch_sync(queue) {[weak self] in
        self?.SendSMS()
    }

    dispatch_sync(queue) {[weak self] in
        self?.SendEmail()

        // here you need to call your completion of success function in main thread
    }
}

请注意,函数中的代码必须存在于同一队列中,并对服务器请求使用同步方法。但这是另一个故事;)

假设
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
}
因此,您可以这样称呼它,将
sendmail
放在
sendSMS
的完成闭包中:

self.sendSMSWithCompletion() {
    self.sendEmail()
}

我不知道您的
sendSMS
sendmail
正在做什么,但是如果您正在调用
MessageUI
框架,您通常会在主队列上这样做。但是,如果您确实需要在专用队列上执行上述操作,那么可以随意将其分派到那里。但希望这能说明这一概念:(a)供应链关闭;(b) 保存它,以便您的代表可以调用它;(c)调用委托时,使用该闭包属性,然后重置它。

如果要使用
[弱self]
,则可能需要执行“可选链接”,例如
self?.SendSMS()
。实际上,你说的是“在这些块完成之前不要保留
self
,但是如果被释放,那么崩溃。”它不会崩溃,这个“self”在现有的闭包中使用,但是当它们被释放时,当然是在完成后,引用“self”将被删除。首先感谢您的回答dimpiax,但我为什么要使用组来完成我试图实现的任务?因为,据我所知,您希望连续处理您的任务。谢谢Rob。我是用一种简化的方法制作的,但我想它一定像你说的那样工作。谢谢你的反馈。