我正在尝试循环遍历一个包含2016年10月份日期的字符串对象数组,也就是31个字符串对象:从10月1日到10月31日。对于每个对象,我想从数据库中检索一些数据,并将返回值(同样是字符串对象)附加到新数组中。然而,棘手的部分在于,新的字符串对象数组应该按照与日期数组完全相同的顺序排列。例如,新数组中的第5个对象应该是我日期数组中第5个对象(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