在另一个NSOperation中执行NSOperations
我有一个应用程序需要使用API将多个实体类型与后端同步。
为此,我为每个HTTP方法创建了一个NSOperation的子类(GET / POST / PUT / DELETE => 4操作)。 对于一个给定的实体,这些操作必须以特定的顺序运行,所以我创建了第5个操作子类,它包含同步序列(基本上是一个按适当顺序创建多个GET / POST / PUT / DELETE操作并添加这些操作的操作到由该操作创建的队列)。
因为我希望能够同时根据用户的连接和某些类型的实体之间的依赖关系同步多种实体(例如“用户”/“事件”/“任务”)(例如,我需要先完成“用户”同步,然后才能同时启动“事件”和“任务”同步)我使用仅包含NSOperations类型同步的NSOperationQueue。
因此,总结一下,如果我对每种类型的对象进行了每种类型(1次创建,1次更新...)的1次更改,并且我想同步所有内容。 我将有1个NSOperationQueue包含3个NSOperation(每种类型的对象1个),每个NSOperation将有自己的NSOperationQueue,它应该运行4个NSOperation(每种更改类型1个)。
现在出现了这些问题:
第1 /“子操作”使用异步NSURLConnection,我不知道应如何配置NSURLConnection?
我应该使用这样的东西:
connection = [[NSURLConnection alloc] initWithRequest: theRequest delegate: self startImmediately: NO];
NSRunLoop * currentRunLoop = [NSRunLoop currentRunLoop];
[currentRunLoop addPort: [NSPort port] forMode: NSDefaultRunLoopMode];
[connection scheduleInRunLoop: currentRunLoop forMode: NSDefaultRunLoopMode];
[connection start];
[currentRunLoop run];
或者我应该使用它:
while (!finished)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
2nd /目前我正在重写操作的开始,因为我希望能够在没有使用NSOperationQueue的情况下启动它们,当我只有一个操作时。 这是对的吗 ? 如果是的话,有没有例子在启动方法实现的地方?
第3 /关于runloops和线程,每个操作总是会得到不同的runloop和线程? 如果我重写它,这个线程/ runloop管理必须在start方法中处理?
4 /使用像我这样的队列是一个问题(我认为这对我来说是合理的)?
1)我倾向于在后台运行时使用同步请求。 我发现它更干净,而且你已经在背景中。
2)在我看来,NSOperation的子类化并不灵活,并且会产生一些草率的代码。 相反,我会建议保留某种具有NSOperationQueue的服务类,并从那里使用[NSOperationQueue addOperationWithBlock:]。 如果你想创建一个NSBlockOperation,你甚至可以更进一步。 你从这个API中获得的主要功能是拥有一个完成块。 但我发现保持服务层和操作(在这种情况下以块的形式)更易于管理和理解。 你甚至可以创建返回块的函数,以便块可以被重复使用。 这可能有助于您获得比NSOperation子类更好的代码重用示例:
-(void)foo
{
__weak ClassName wself = self;
void(^opBlock)() = ^{ [wself doStuff]; };
[_queue addOperationWithBlock:opBlock]
}
3)是的,你的队列将有它自己的运行循环。
4)也许参考其他人
链接地址: http://www.djcxy.com/p/65123.html