0

我正在编写一个 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]
    }
4

1 回答 1

1

我会考虑使用Apple GCD Docs中的 NSOperationQueue...

GCD 不限于系统级应用程序,但在将其用于更高级别的应用程序之前,您应该考虑 Cocoa 中提供的类似功能(通过 NSOperation 和块对象)是否更易于使用或更适合您的需求。有关详细信息,请参阅并发编程指南。

具体看看使用NSBlockOperation您可以使用addExecutionBlock:将每个数据请求添加到单独的执行块中。然后使用setCompletionBlock:设置完成块。确保在主线程上触发完成块。

如果您必须使用 GCD,那么我建议您查看groups

与stackoverflow相关的问题有很好的答案:

于 2012-12-27T16:51:43.413 回答