我正在编写一个 iPad 应用程序,在其中异步加载多层建筑的数据。一旦所有楼层的数据加载完成,我已经设置了 NSNotifications 来提醒用户。
当在 ChildViewController(弹出式 VC)中按下加载按钮时,每个楼层的数据加载将循环启动
ChildViewController 从 ParentViewController 启动。
我在 ChildViewController 中为名为“dataloaded”的通知添加了一个观察者,并设置了一个处理函数 childDataLoaded 来处理该通知。
由于 ChildViewController 可能在数据加载完成之前被解除,我还在 ParentViewController 中设置了一个观察者和处理程序(parentDataLoaded)来处理相同的“数据加载”通知。
我在 AppDelegate 中实现了数据加载函数 'parseAndSaveData'。单击 ChildViewController 按钮时调用 parseAndSaveData。它将楼层标识符(NSString)作为参数。它调用 Web 服务来获取该楼层的数据并将这些数据加载到数据库中。网络服务很快,但将数据添加到 sqllite 数据库需要更长的时间(我使用的是核心数据)。因此,我使用 dispatch_asynch 调用来调用这个数据加载部分(因为这是最耗时的部分)。
完成后的数据加载部分会发布“已加载数据”通知。
我希望此通知能够调用 ChildViewController 或 ParentViewController 中的处理程序(以在发布通知时处于活动状态)
我遇到的问题是通知是不可预测的,我看到只有一个处理程序(ChildViewController 中的那个)被调用,并且它只被调用到一个楼层,尽管所有楼层都成功加载。
任何有关上述设计和实施或替代方案的建议将不胜感激!
为@Samuel 的 dispatch_group 建议添加代码
Confirm action on my popup VC kicks off the following…
creates a a GCD dispatch_group, floorDataGroup
creates a GCD dispatch_queue, floorDataQueue, using dispatch_get_global_queue
with default priority
loops over floors in building and for each floor {
dispatch_group_async(floorDataGroup, floorDataQueue, ^{
// start dispatch_group_async block
//gets rooms details for the building and floor as follows:
Calls webservice (using AFNetworking Library) to get room details,
which on success executes a block
( ^{
Parses the XML, extracts room data
Inserts room data into Core Data/sqllite table
}); //end web service success block
}); //end dispatch_group_async block
} //end loop over each floor
dispatch_group_notify(floorDataGroup, floorDataQueue, ^{
//start dispatch_group_nbotify block
create alert (UIAlert) with message “All floors loaded”
and an OK button to dismiss the alert
[alert show]
}