异步数据连接iOS

时间:2012-09-05 09:51:40

标签: iphone ios oauth nsurlrequest block

我为我正在处理的应用编写了一个同步类。

由于数据量很大,它首先获取数据,然后在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;

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

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

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

现在我能想到的唯一方法是将它们连接起来......

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

这只是一团糟,可能会非常混乱。

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

1 个答案:

答案 0 :(得分:3)

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

  • 您从一个基本的并发操作开始,该操作执行Web提取,获取一些数据。
  • 使用子类,您可以以不同的方式处理该数据
  • 因为它的并发,意味着它有自己的runloop,它可以阻止等待消息,所以你可以在其中包含授权
  • 你可以使用你想要的任何逻辑 - 如果你在中间获得授权失败,你可以取消你的网址请求,授权,然后在一次操作中再做一次
  • 您可以将操作链接起来,以便一次不会有多个活动

我正在将此结构用于我的所有网络交互,并且有类似于30个子类的内容,对接收到的数据执行不同类型的处理。

该项目有三个主要类别:

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

  • ConcurrentOperation - 最低限度

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

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