2

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

由于数据量很大,它首先获取数据计数,然后将下载批量处理为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();
      }];
}

这样可以将内存使用量保持在最低水平,并将速度保持在最大水平。这个想法是下载和进程都在同一个块中,并且在继续队列中的下一个操作之前都已处理。

除了,我们现在已经在服务器上实现了 OAuth2 来对调用进行身份验证。

我通过 NXOAuth2 库设置 NXOAuth2Request 来完成这项工作。然后设置帐户并提取签名的 URL 请求。然后我像以前一样使用这个 NSURLRequest。

这样做的问题是,如果 OAuth 令牌在同步中途过期,则同步失败。

NXOAuth2 库有一个功能......

+ (void)performMethod:(NSString *)aMethod
           onResource:(NSURL *)aResource
      usingParameters:(NSDictionary *)someParameters
          withAccount:(NXOAuth2Account *)anAccount
  sendProgressHandler:(NXOAuth2ConnectionSendingProgressHandler)progressHandler
      responseHandler:(NXOAuth2ConnectionResponseHandler)responseHandler;

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

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

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

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

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

这只是混乱,可能会变得非常混乱。

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

4

1 回答 1

3

虽然我喜欢块,但只有一些任务最好使用并发 NSOperations 来完成。我在 github 上放了一个非常简单非常容易采用的项目,使用与我在商店中的应用程序中使用的完全相同的文件来获取和处理数据。您可以轻松地将相同的策略调整到您的任务中。

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

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

该项目具有三个主要类别:

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

  • ConcurrentOperation - 最低限度

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

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

于 2012-09-05T11:23:54.783 回答