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的类,当它完成时就完成了
其他的子类只需要提供一个“完整的”方法来处理数据。
- 在View Controller之后,iOS块阻止exceptioncallback导致崩溃
- ios fmdb内存泄漏
- 使用RestKit,使用block来加载对象,何时以及如何取消请求?
- 在ARC中生成CGImagesAsynchronouslyForTimes
- 如何传递一个块作为select器与参数performSelector:withObject:?
- 阻止和保留周期不能赶上它
- OpenWithCompletionHandler完成后如何返回结果
- 我如何创build一个全局UIManagedDocument实例每个文件在磁盘上由我的整个应用程序使用块共享?
- 为什么我们在@synchronized块中传递self?