Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.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 如何使用分派或操作队列动态更改后台操作优先级。_Ios_Multithreading_Grand Central Dispatch_Nsthread_Nsoperationqueue - Fatal编程技术网

Ios 如何使用分派或操作队列动态更改后台操作优先级。

Ios 如何使用分派或操作队列动态更改后台操作优先级。,ios,multithreading,grand-central-dispatch,nsthread,nsoperationqueue,Ios,Multithreading,Grand Central Dispatch,Nsthread,Nsoperationqueue,这是我遇到的问题。当应用程序运行时,我有几个任务要在后台完成。当我通过将这些任务推到并发调度队列在后台运行这些任务时,完成所有任务需要10秒以上的时间。它们基本上从磁盘加载数据并对其进行解析,然后向用户表示结果。也就是说,它们只是缓存的结果,极大地改善了用户体验 该缓存结果用于应用程序内的特定功能,如果在打开应用程序后未立即使用该功能,则加载支持该功能的数据需要10秒并不成问题,因为当用户决定使用该功能时,该数据将已加载 但当用户在打开应用程序后立即在应用程序中输入该功能时,加载数据需要相当长的

这是我遇到的问题。当应用程序运行时,我有几个任务要在后台完成。当我通过将这些任务推到并发调度队列在后台运行这些任务时,完成所有任务需要10秒以上的时间。它们基本上从磁盘加载数据并对其进行解析,然后向用户表示结果。也就是说,它们只是缓存的结果,极大地改善了用户体验

该缓存结果用于应用程序内的特定功能,如果在打开应用程序后未立即使用该功能,则加载支持该功能的数据需要10秒并不成问题,因为当用户决定使用该功能时,该数据将已加载

但当用户在打开应用程序后立即在应用程序中输入该功能时,加载数据需要相当长的时间(从用户的角度来看)。此外,在同一时刻不需要整个数据,而是在给定时刻需要其中的一部分。 这就是为什么我们需要同时加载数据,如果可能的话,尽快得到结果。这就是为什么我决定将数据分成块,当用户请求数据时,我们应该按后台线程加载相应的块,并给该线程最高优先级。我会解释我的意思

假设有100条数据,加载所有数据需要10秒以上的时间。每当用户第一次查询数据时,应用程序就会确定用户需要的数据块并开始加载该数据块。加载该部分后,剩余的数据也将在后台加载,以使以后的查询更快(无需延迟加载缓存)。但这里出现了一个问题,当用户在输入查询后立即决定更改查询,并且该更改发生在数据加载过程的第二秒(记住加载数据需要10秒以上,我们仍然有8秒以上的时间完成加载过程),然后,在极端情况下,用户将在所有数据加载之前接收其数据。这就是我需要以某种方式管理后台任务执行的方式。也就是说,当用户更改输入时,我应该更改执行的优先级,并在不停止的情况下为加载相应块的线程提供最高优先级,这样它将获得更多的处理器时间,更快地完成,并更快地向用户交付结果,而不是保持优先级不变。我知道我可以为队列分配优先级。但是,有没有一种方法可以在它们仍在执行时动态地更改它们? 或者为了实现这些行为,我需要实现自定义线程管理吗?我真的不想深入研究线程管理,如果可以只使用调度或操作队列实现,我会很高兴

我希望我已经很好地描述了这个问题。如果不清楚,请在下面评论,我会解释


非常感谢您阅读到目前为止:)并特别感谢将提供答案的人。非常感谢其中一位,他将使用调度或操作队列为我提供解决方案:)

恐怕唯一的方法是在开始新操作之前取消正在运行的操作。 在完成或取消之前,无法将其从队列中删除

作为对您的问题的改进,我建议加载即使用户在后台也不需要的东西,这样您就可以在缓存中加载它们

当用户在LowPriorityQueue上空闲时,您可以创建2个具有2种不同优先级的NSOperationQueue,并在后台下载内容。对于重要的操作,您可以使用高优先级队列—每次搜索项更改时,您都将取消该队列


最重要的是,您只需要缓存这两个队列的结果。

我认为您需要摆脱对队列运行优先级的考虑(对于您描述的场景来说,这听起来并不重要)以及如何使用分派I/O或更简单的分派源来控制如何读入数据。正如您所说,加载数据需要10秒钟,如果用户在请求后立即更改查询,您需要停止读取前一个请求的数据,并执行任何需要执行的操作以完成最近的查询。使用Dispatch I/O(异步)分块数据并异步更新UI将允许您中途改变主意(使用某种信号量或取消标志),或者继续滴入数据(如果用户改变主意,您不会说该数据是否仍然有用),暂停读取过程,或完全取消读取过程并启动新操作。因此,能够挂起/恢复一个源,并让它对相当小的数据块进行回调,肯定会使您能够在比8秒更细粒度的时间块上做出决策

至于第一个建议,我已经考虑过了,但不认为破坏加载的数据是个好主意。至于第二个建议,即使用户不需要,我也会加载数据。正如我所说,我会在应用程序启动后立即开始加载过程。唯一极端的情况是,用户在应用程序启动后立即开始搜索,这是我想要提高响应速度的部分。但我认为,是的,唯一的办法是取消作业并重新启动。也许我可以在加载过程中设置检查点,这样取消时不会丢失所有工作,所以我可以从最后一个检查点继续。谢谢你的回答。我等一下,也许有人再给我提个建议。但很难。谢谢你的回答。实际上,加载不是结果查询,而是从磁盘加载的索引。所以我需要它,即使使用