首先,我是一个初学者,我打算做什么到这里引起我的问题的几个假设,这可能听起来很愚蠢,所以请与我裸露。如何一次运行多个后台线程任务? (SWIFT 3)所有的
我通过包含月份的日期String对象的数组2016年10月,这意味着31个String对象试图循环:2016年10月1日... 10月31日2016年对于每一个对象我想要从一些数据数据库并将返回值(也是一个String对象)附加到新数组。但棘手的部分是,新的String对象数组应该与日期数组的顺序完全相同。因此,例如,新的数组中的第五对象应该是在我的日期排列第五对象的新阵列中的返回值(2016年10月5日)和14日对象应该是在我的日期排列的14对象的返回值( 2016年10月14日)等等。显然,数据库检索过程发生在后台线程中,假设系统希望尽快完成整个过程,它会同时触发多个检索任务(全部在自己的线程中)。这样做的问题是它真的会混淆新数组的构建顺序。说实话,它看起来非常混乱,怪异的一部分是数组的顺序不是随机的(这很可能已经证实了我的假设):新阵列的顺序是按照正确的顺序本质上是第8个返回值然后从第9个值的第8个值得到重复,所以有点像这样:
1 October -> 5
2 October -> 8
3 October -> 4
4 October -> 11
5 October -> 9
6 October -> 7
7 October -> 6
8 October -> 14
9 October -> 5
10 October -> 8
11 October -> 4
12 October -> 11
13 October -> 9
14 October -> 7
15 October -> 6
16 October -> 14
17 October -> 5
18 October -> 8
19 October -> 4
20 October -> 11
21 October -> 9
22 October -> 7
23 October -> 6
24 October -> 14
25 October -> 5
26 October -> 8
27 October -> 4
28 October -> 11
29 October -> 9
30 October -> 7
31 October -> 6
所以你可以在这个模式中看到,它只是取8个不同的值,然后重复一遍,直到阵列充分。如果我在很短的时间内运行整个循环过程两次,那么顺序通常仍然是相同的,除了数组中的第一个值不再相同(所以基本上每个值都会移动1个日期)。无论如何,要切入正题:我假设逐个执行每个检索任务将解决我的问题。这是我当前正在运行的循环:
// Loop through each date
for date in self.datesToDisplay {
// Fire off retrieval method with date object as its only parameter
self.getMessagesForDate(date)
}
我的模型将返回的值追加到一个新的数组和新创建的数组传递给调用者,就像这样:
// Delegate method which gets called whenever retrieval is finished
func messagesRetrieved() {
// Pass newly created array back to caller
self.messagesForDatesToDisplay = self.retrieveModel.messages
}
的上面的代码是我在项目中运行的实际代码的一个简化版本,但您明白了。第一个问题是:我是否可以接近正确的方向,并假设可能导致此问题?第二后续问题是:如果我是正确的,我怎么能肯定的是,第二检索过程不会开始,直到第一个全部完成(所以委托方法返回被称为价值和运行后)?
为什么不能使用'NSOperationQueue'来连续添加每个操作。 – Santosh