asynchronous数据连接iOS

我为当前正在编写的应用程序编写了一个同步类。

由于数据量很大,它首先得到一个数据计数,然后在NSOperationQueue批量下载。 这一切工作正常,我有快速工作的同步algorithm。

它的工作方式如下…

 - (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来validation呼叫。

我已经通过NXOAuth2库build立了一个NXOAuth2Request。 然后设置帐户并提取签名的URL请求。 然后我就像以前那样使用这个NSURLRequest。

问题在于,如果OAuth令牌在同步中途过期,则同步失败。

NXOAuth2库有一个function…

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

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

但是,这个function是asynchronous的,所以我不知道如何最好地把它放到我的同步程序中。

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

我现在想的唯一办法就是将它们菊花链连接起来。

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

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

有没有其他办法可以处理这个呢? 我唯一能想到的其他事情就是自己去尝试一下。

尽pipe我喜欢积木,但只有一些与并发的NSOperations完成最好的任务。 我在github上实现了一个非常简单的项目 ,使用我在商店中的应用程序中使用的EXACT相同的文件来获取和处理数据。 你可以很容易地把这个相同的策略适应你的任务。

  • 你从一个基本的并发操作开始,进行网页抓取,获取一些数据。
  • 有了子类,你可以用不同的方式处理这些数据
  • 因为它的并发,意味着它有自己的runloop,它可以阻止等待消息,所以你可以把你的授权纳入其中
  • 你可以使用任何你想要的逻辑 – 如果你在中间的授权失败,你可以取消你的url请求,授权,然后在一个操作中做另一个
  • 你可以将操作连锁起来,这样你就永远不会有更多的活动

我使用这个结构来处理所有的Web交互,并且有30个子类对接收到的数据进行不同types的处理。

该项目有三个主要类别:

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

  • 并行运行 – 最低限度

  • WebFetcher – 一个运行NSURLConnection的类,当它完成时就完成了

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