在另一个NSOperation中执行NSOperations

时间:2013-10-09 15:12:41

标签: objective-c nsoperation nsoperationqueue

我有一个应用需要使用API​​与后端同步多个实体类型。

为此,我为每个HTTP方法创建了一个NSOperation的子类(GET / POST / PUT / DELETE => 4个操作)。对于给定的实体,这些操作必须以特定的顺序运行,因此我创建了第5个操作子类,其中包含同步序列(基本上是以适当的顺序创建多个GET / POST / PUT / DELETE操作并添加这些操作的操作到操作创建的队列。)。

因为我希望能够同时同步多种实体(例如'用户'/'事件'/'任务'),具体取决于用户的连接以及某些类型的实体之间的依赖关系(例如,我需要完成“用户”同步才能同时​​启动“事件”和“任务”同步。我使用的NSOperationQueue只包含类型同步的NSOperations。

总而言之,如果我对每种类型的对象进行了1次更改(1次创建,1次更新,...),并且我想要同步所有内容。我将有1个NSOperationQueue,它将包含3个NSOperations(每种类型的对象1个),并且每个NSOperation都有自己的NSOperationQueue,它应该运行4个NSOperation(每个更改类型1个)。

现在出现了问题:

1st /“子操作”正在使用异步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]];
}

第二/目前我正在重新开始操作,因为我希望能够在没有使用NSOperationQueue时启动它们,而我只有1次操作。这是对的吗 ?如果是,是否有启动方法实现的示例?

3nd /关于runloops和线程,每个操作总是得到一个不同的runloop和线程?如果我覆盖它,那么必须在start方法中处理这个线程/ runloop管理吗?

第四/使用像我这样的队列是一个问题(我认为这在我的情况下是合理的)?

1 个答案:

答案 0 :(得分:0)

1)我倾向于在后台运行时使用同步请求。我发现它更干净,而且你已经在后台了。

2)在我看来,对NSOperation进行子类化并不灵活,并且会产生一些草率的代码。相反,我建议保留某种具有NSOperationQueue的服务类,并从那里使用[NSOperationQueue addOperationWithBlock:]。如果需要并创建NSBlockOperation,您甚至可以更进一步。您从此API获得的主要功能是具有完成块的能力。但我发现保持服务层和操作(在这种情况下以块的形式)更容易管理和理解。您甚至可以创建返回块的函数,以便可以根据需要重复使用块。这可以帮助您获得更好的代码重用,而不是继承NSOperation 例如:

-(void)foo
{
   __weak ClassName wself = self;
    void(^opBlock)() = ^{ [wself doStuff]; };
    [_queue addOperationWithBlock:opBlock]
}

3)是的,你的队列将有自己的运行循环。

4)也许参考其他人