Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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_Nsoperationqueue - Fatal编程技术网

Ios 如何在Swift中暂停操作队列

Ios 如何在Swift中暂停操作队列,ios,swift,nsoperationqueue,Ios,Swift,Nsoperationqueue,我有几个操作要从iOS应用程序在物联网设备上执行。因此,我所有的操作都在操作队列中,带有串行操作 在这里,我希望一次执行一个操作,每个操作都需要等待,直到我从物联网设备获得响应 在这里,物联网设备响应需要时间才能发回。所以,如何等待操作队列中的当前操作,直到我从IoT获得响应 所以,有没有办法暂停当前运行的操作,直到收到IoT的响应,然后我将恢复它,以便操作队列中的下一个操作将开始 我尝试过睡眠操作,但需要时间,但我们无法保证物联网设备的响应 任何建议都将不胜感激。提前感谢。基本思想是,您不需要

我有几个操作要从iOS应用程序在物联网设备上执行。因此,我所有的操作都在操作队列中,带有串行操作

在这里,我希望一次执行一个操作,每个操作都需要等待,直到我从物联网设备获得响应

在这里,物联网设备响应需要时间才能发回。所以,如何等待操作队列中的当前操作,直到我从IoT获得响应

所以,有没有办法暂停当前运行的操作,直到收到IoT的响应,然后我将恢复它,以便操作队列中的下一个操作将开始

我尝试过睡眠操作,但需要时间,但我们无法保证物联网设备的响应


任何建议都将不胜感激。提前感谢。

基本思想是,您不需要暂停、等待或睡眠,而是定义一个“并发”操作。请参阅并发操作的讨论,该操作在设备响应之前不会触发KVO

一种简单的方法是编写一个并发操作类,如。然后,IoT操作可以将该AsynchronousOperation类子类化,并在设备响应时调用finish


然后,假设maxConcurrentOperationCount为1的操作队列,或者可能正在使用依赖项的操作队列,在上一个操作完成之前不会启动操作。

基本思想是,您不需要暂停、等待或睡眠,而是定义“并发”操作请参阅并发操作的讨论,在设备响应之前不会触发KVO

一种简单的方法是编写一个并发操作类,如。然后,IoT操作可以将该AsynchronousOperation类子类化,并在设备响应时调用finish

然后,假设maxConcurrentOperationCount为1的操作队列,或者可能正在使用依赖项的操作队列,在前一个操作完成之前不会启动操作。

如前所述,您可以从IoT操作中实现异步操作类和子类。对我来说,这似乎是实施yr案例的最佳方式

另一种选择是,如果仅在另一个线程中的某个异步事件完成后才需要继续进程,则可以使用。这是obj-c提供的一种机制,提供了一种等待条件发生的简单方法

下面是一个例子:

设cond=n条件 var available=false var sharedString= 类WriterThread:Thread{ 覆盖函数主{ 对于uu in 0..如前所述,您可以从IoT操作中实现异步操作类和子类。对我来说,这似乎是实现yr案例的最首选方法

另一种选择是,如果您只需要在另一个线程中的某个异步事件完成后才需要继续进程,则可以使用。这是obj-c提供的一种机制,它提供了一种等待条件发生的简单方法

下面是一个例子:

设cond=n条件 var available=false var sharedString= 类WriterThread:Thread{ 覆盖函数主{ 对于0..中的uuu,您可以使用DispatchQueue和call.suspend发送操作,并使用获取响应调用的代码。resume。然后,在继续之前,只要在任何地方等待响应,就可以放置一个虚拟队列。sync{printdone waiting}并且它将自动等待。在打印和继续之前,已调用resume

import Dispatch
var queue = DispatchQueue(label: "queue")

func sendOperationToIoTDevice(){
    //send the operation
    //...
    queue.suspend()
}

您可以使用DispatchQueue和call.suspend发送操作,并使用获取响应调用的代码。resume。然后,无论您想在哪里等待响应然后继续,只需放置一个虚拟队列。sync{printdone waiting},它将自动等待,直到在打印和继续之前调用了.resume

import Dispatch
var queue = DispatchQueue(label: "queue")

func sendOperationToIoTDevice(){
    //send the operation
    //...
    queue.suspend()
}


也许等待直到所有操作在操作队列上完成可以帮助您做到这一点也许等待直到所有操作在操作队列上完成可以帮助您做到这一点Rob,感谢您的回复我会处理它并让您知道。Rob,非常感谢,我使用了示例,它正如我所期望的那样工作。Rob,感谢您的回复我将工作罗布,非常感谢,我处理了这个样本,它正按照我的预期工作。外国佬,谢谢你花时间回复。我找到了一个解决方案。外国佬,谢谢你花时间回复。我找到了一个解决方案。
//main code

sendOperationToIoTDevice()
queue.sync { print("done waiting") } // will hang here until .resume() is called