gpt4 book ai didi

iphone - 异步数据连接 iOS

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:13:49 26 4
gpt4 key购买 nike

我已经为我目前正在开发的应用程序编写了一个同步类。

由于数据量很大,它首先获取数据计数,然后在 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)performMethod:(NSString *)aMethod
onResource:(NSURL *)aResource
usingParameters:(NSDictionary *)someParameters
withAccount:(NXOAuth2Account *)anAccount
sendProgressHandler:(NXOAuth2ConnectionSendingProgressHandler)progressHandler
responseHandler:(NXOAuth2ConnectionResponseHandler)responseHandler;

这通过在执行 token 刷新后重新发送请求来处理过期 token 的情况。

但是,这个函数是异步的,所以我不确定如何最好地将它适合我的同步程序。

我可以使用它添加操作,然后将处理放入完成 block 中。但这样做意味着所有下载几乎都将同时运行,然后无法保证下载的处理顺序(由于数据依赖性,我需要以严格的顺序处理它们。

我现在能想到的唯一方法是将它们以菊花链方式连接在一起...

[NXOAuth2Request performFirstRequest...
{
deal with the data.
[NXOauth2Request performSecondRequest...
{
deal with the data.
[NXOauth2Request performThirdRequest...
{
deal with the data.
finish
}];
}];
}];

这很乱,而且可能会变得非常乱。

还有什么其他方法可以处理这个问题吗?我能想到的唯一一件事就是尝试让自己焕然一新。

最佳答案

虽然我喜欢 block ,但只有一些任务最好用并发 NSOperations 完成。我放了一个 really simple really easy to adopt project在 github 上,使用我在商店应用程序中使用的完全相同的文件来获取和处理数据。您可以轻松地将相同的策略应用到您的任务中。

  • 您从一个基本的并发操作开始,该操作执行 Web 抓取,获取一些数据。
  • 通过子类,您可以用不同的方式处理数据
  • 由于它是并发的,这意味着它有自己的运行循环,它可以阻止等待消息,因此您可以在其中合并您的授权
  • 您可以使用您想要的任何逻辑 - 如果您在中间遇到授权失败,您可以取消您的 url 请求,授权,然后在一个操作中执行另一个操作
  • 您可以链接操作,这样您就不会同时有多个事件

我将这种结构用于我所有的网络交互,并且有大约 30 个子类对接收到的数据进行不同类型的处理。

该项目有三个主要类:

  • OperationsRunner - 一个非常小的类,为 NSOperationsQueue 提供高级接口(interface)

  • ConcurrentOperation - 最低要求

  • WebFetcher - 一个运行 NSURLConnection 并在它运行时完成的类

其他子类只需要提供一个“完整”的方法来处理数据。

关于iphone - 异步数据连接 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12278717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com