我对多线程和iOS都很陌生,我在如何处理这个问题上遇到了一个心理障碍。我不需要大量的代码,也不需要您为我编写代码,我只是在寻找更多的概念方法,或者可能是简短的伪代码。
我在iPad上有一个应用程序。
我在Azure (云存储)上存储了应用程序使用的8个文件
用户可以随意下载这8个文件,以便在iPad上本地使用。
每隔30分钟,我会检查Azure上的8个文件,并将它们与本地存储的文件进行比较,以找出差异。Azure上的每个更改文件(为简单起见,称其为Azure文件与本地文件的散列比较)在计算iPad上的内容与azure上的内容之间的更改文件时,都算作"+1“。
我遇到的问题是,Azure存储文件的方式,我有必要从iPad发出2个异步web请求,在第一个调用中获取8个文件中的3个,在第二个调用中获得5个文件。
那么,我需要能够比较所有的8个在一次,以便能够正确地更新徽章与正确的计数多少文件已经改变。如果我只是处理第一个web调用(假设一个文件已经改变了),那么我用一个1更新这个徽章,几秒钟后第二个web请求的响应出现了,三个文件已经改变了,我用3更新了这个徽章,这是不正确的,因为它应该是4。从第一个web请求的响应中的1更改,+从第二个web请求的响应中的3个更改。
那么,从这2个web请求响应中积累结果的最佳/最简单方法是什么,这样我就可以一次对所有8个文件进行一次比较,并使用适当的计数更新徽章。
发布于 2013-09-16 13:18:37
我可以建议你用两种方法来完成你的任务。
发布于 2013-09-16 10:15:18
在不了解更多细节的情况下,我能想到的最简单的解决方案是在管理文件检查(伪代码)的实例中执行类似的操作:
- (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 */ }
包围方法体。
https://stackoverflow.com/questions/18834465
复制