累积来自单独Web请求的结果

时间:2013-09-16 18:05:00

标签: ios objective-c web-services

我对多线程和iOS都很陌生,而且我遇到了解决这个问题的精神障碍。我不需要大量的代码或者希望你为我编写代码,而是我只是在寻找概念方法,或者简单的伪代码。

我在iPad上有一个应用程序。

我有8个存储在Azure(云存储)

上的应用程序使用的文件

用户可以随心所欲地下载这8个文件,以便在iPad上本地使用。

每隔30分钟,我会检查Azure上的8个文件,并将它们与本地存储的文件进行比较以获得差异。 Azure上的每个更改文件(简称为azure文件与本地文件的哈希比较)在计算iPad上的更改文件与Azure上的内容时计为“+1”。

我遇到的问题是,Azure存储文件的方式,我需要从iPad发出2个异步Web请求,在第一次调用中获取8个文件中的3个,并且在8个文件中有5个在第二个电话。

好吧,我需要能够一次比较所有8个,以便能够正确更新徽章,并正确计算已更改的文件数量。如果我只是处理第一个网络电话(并说1个文件已经更改),那么我用1更新徽章,几秒钟后第二个网络请求的响应进来,3个文件发生了变化,我更新了徽章3,嗯,这是不正确的,因为它应该是4.从第一个Web请求的响应中改变1,从第二个Web请求的响应中改变3个。

那么从这两个Web请求响应中积累结果的最佳/最简单的方法是什么,这样我就可以一次比较所有8个文件,并使用正确的计数更新徽章。

2 个答案:

答案 0 :(得分:0)

在不了解更多细节的情况下,我能想到的最简单的解决方案是在管理文件检查的实例中执行类似的操作(伪代码):

- (void)checkForUpdate {
  self.runningRequests = 0;
  self.updatedFiles = 0;
  // Launch each necessary request, incrementing runningRequests appropriately.
}

- (void)requestCallbackMethodWithResponse:(id)response {
  self.updateFiles += response.numberOfUpdates; // or whatever your logic
  self.runningRequests--;
  if (self.runningRequests <= 0) {
    // update badge to match updateFiles
  }
}

如果回调可能会从另一个线程回来,您可以使用@synchronize(self) { /* actual code */ }

包围方法体

答案 1 :(得分:0)

我可以建议你完成任务的两种方法。

  1. 简单的方法。当您开始下载请求时,将updatedFilesCouter设置为-1。在任何操作结束时,您需要进行比较并添加或替换updatedFilesCouter。如果第一个操作要更改updatedFilesCouter,您可以注意到您的值始终为-1,因此您需要替换它。如果第二个操作要更改updatedFilesCouter,那么它的值总是不同于-1,因此您需要添加新值。因此,如果第一个操作有2个更新文件而第二个操作有3个,那么最后你将获得5个,你可以找出哪个操作是最后一个更新徽章值的操作。

  2. 更高级的方式。为您的下载操作制作NSOperationsQueue。在内存中完成任何操作存储文件之后。完成NSOperationQueue后进行比较,然后决定删除/替换文件。