0

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

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

因为我希望能够根据用户的连接以及某些类型实体之间的依赖关系(例如我需要完成“用户”同步,然后才能同时开始“事件”和“任务”同步)我使用一个 NSOperationQueue,它只包含同步类型的 NSOperations。

总结一下,如果我对每种类型的对象进行了 1 次更改(1 次创建,1 次更新,...),并且我想同步所有内容。我将有 1 个 NSOperationQueue,其中包含 3 个 NSOperation(每种类型的对象 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]];
}

第二/目前我正在覆盖操作的启动,因为当我只有 1 个操作时,我希望能够在不使用 NSOperationQueue 的情况下启动它们。这是对的吗 ?如果是,是否有启动方法实现的示例?

第三/关于运行循环和线程,每个操作总是会得到不同的运行循环和线程?如果我覆盖它,这个线程/运行循环管理必须在 start 方法中处理吗?

4th /像我一样使用队列是否有问题(我认为在我的情况下这是合理的)?

4

1 回答 1

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)也许参考其他人

于 2013-10-22T14:28:59.740 回答