我已经为我目前正在开发的应用程序编写了一个同步类。
由于数据量很大,它首先获取数据计数,然后在 NSOperationQueue 中批量下载。这一切都很好,我已经让同步算法快速运行。
它的工作方式如下...
- (void)synchroniseWithCompletionHandler://block for completion handler
errorHandler://block for error handler
{
[self.queue addOperationWithBlock
^{
//Create an NSURLRequest for the first batch
//Send the request synchronously
//Process the result
//If error then cancel all operations in the queue, run errorHandler and return.
}];
[self.queue addOperationWithBlock
^{
//Create an NSURLRequest for the second batch
//Send the request synchronously
//Process the result
//If error then cancel all operations in the queue, run errorHandler and return.
}];
//Add all the remaining batches.
[self.queue addOperationWithBlock
^{
completionHandler();
}];
}
这样可以将内存使用量保持在最低水平,并将速度保持在最高水平。这个想法是下载和进程都在同一个 block 中,并且在继续队列中的下一个操作之前都已处理。
除了,我们现在已经在服务器上实现了 OAuth2 来对调用进行身份验证。
我通过 NXOAuth2 库设置 NXOAuth2Request 来完成这项工作。然后设置帐户并提取签名的 URL 请求。然后我像以前一样使用这个 NSURLRequest。
这样做的问题是,如果 OAuth token 在同步中途过期,则同步失败。
NXOAuth2 库有一个功能...
+ (void)performMethodNSString *)aMethod
onResourceNSURL *)aResource
usingParametersNSDictionary *)someParameters
withAccountNXOAuth2Account *)anAccount
sendProgressHandlerNXOAuth2ConnectionSendingProgressHandler)progressHandler
responseHandlerNXOAuth2ConnectionResponseHandler)responseHandler;
这通过在执行 token 刷新后重新发送请求来处理 token 过期的情况。
但是,这个函数是异步的,所以我不确定如何最好地将它放入我的同步程序中。
我可以使用它添加操作,然后将处理放入完成 block 中。但这样做意味着所有下载几乎都将同时运行,因此无法保证下载处理的顺序(由于数据依赖性,我需要以严格的顺序处理它们。
我现在能想到的唯一方法就是将它们全部连接在一起......
[NXOAuth2Request performFirstRequest...
{
deal with the data.
[NXOauth2Request performSecondRequest...
{
deal with the data.
[NXOauth2Request performThirdRequest...
{
deal with the data.
finish
}];
}];
}];
这只是困惑,可能会变得非常困惑。
还有其他方法可以处理这个吗?我能想到的唯一另一件事就是尝试自己提神。
Best Answer-推荐答案 strong>
虽然我喜欢 block ,但只有一些任务最好使用并发 NSOperations 来完成。我放了一个really simple really easy to adopt project在 github 上,使用与我在商店中的应用程序中使用的完全相同的文件来获取和处理数据。您可以轻松地根据您的任务调整相同的策略。
- 您从一个基本并发操作开始,该操作执行网络抓取,获取一些数据。
- 通过子类,您可以以不同的方式处理数据
- 由于它是并发的,这意味着它有自己的运行循环,它可以阻止等待消息,因此您可以在其中合并您的授权
- 您可以使用任何您想要的逻辑 - 如果您在中间遇到授权失败,您可以取消您的 url 请求,授权,然后在一个操作中执行另一个操作
- 您可以链接操作,这样您一次不会有超过一个事件
我在所有网络交互中都使用这种结构,并且有大约 30 个子类对接收到的数据进行不同类型的处理。
该项目有三个主要类:
OperationsRunner - 一个非常小的类,为 NSOperationsQueue 提供高级接口(interface)
ConcurrentOperation - 最低限度
WebFetcher - 一个运行 NSURLConnection 并在运行时完成的类
其他子类只需要提供一个“完整”的方法来处理数据。
关于iphone - 异步数据连接 iOS,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/12278717/
|