0

我对多线程和 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 变化。

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

4

2 回答 2

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 */ }

于 2013-09-16T18:15:18.260 回答
0

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

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

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

于 2013-09-16T21:18:37.713 回答