我的问题是数据库写入操作是否发生在main中
如果您从头开始创建NSOperationQueue
,如下所示:
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
它将位于后台线程中:
操作队列通常提供用于运行其任务的线程
除非您使用的是mainQueue
:
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
您还可以看到如下代码:
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
[myQueue addOperationWithBlock:^{
// Background work
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// Main thread work (UI usually)
}];
}];
和GCD版本:
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
{
// Background work
dispatch_async(dispatch_get_main_queue(), ^(void)
{
// Main thread work (UI usually)
});
});
NSOperationQueue
可以更好地控制您想要做的事情.您可以在这两个操作之间创建依赖关系(下载并保存到数据库).要在一个挡路和另一个挡路之间传递数据,例如,您可以假设服务器将发送一个NSData
,因此:
__block NSData *dataFromServer = nil;
NSBlockOperation *downloadOperation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakDownloadOperation = downloadOperation;
[weakDownloadOperation addExecutionBlock:^{
// Download your stuff
// Finally put it on the right place:
dataFromServer = ....
}];
NSBlockOperation *saveToDataBaseOperation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakSaveToDataBaseOperation = saveToDataBaseOperation;
[weakSaveToDataBaseOperation addExecutionBlock:^{
// Work with your NSData instance
// Save your stuff
}];
[saveToDataBaseOperation addDependency:downloadOperation];
[myQueue addOperation:saveToDataBaseOperation];
[myQueue addOperation:downloadOperation];
Edit:为什么我使用__weak
作为操作参考,可以在here中找到.但简而言之,就是要避免循环.