我必须在我的应用程序中执行一系列的下载和数据库写入操作.我用NSOperationNSOperationQueue也是一样的.

以下是应用场景:

  • 从一个地方取所有的邮政编码.
  • 对于每个邮政编码,取所有的房子.
  • 每栋房子的住户信息

如前所述,我 for each 任务定义了NSOperation.在第一种情况(Task1)中,我向服务器发送获取所有邮政编码的请求.NSOperation内的代表将接收数据.然后将该数据写入数据库.数据库操作在不同的类中定义.在NSOperation类中,我调用了数据库类中定义的WRITE函数.

我的问题是数据库写操作是发生在主线程中还是发生在后台线程中?当我在NSOperation范围内调用它时,我希望它在与NSOperation不同的线程(不是MainThread)中运行.有人能在处理NSOperationNSOperationQueue的时候解释一下这个场景吗?

推荐答案

我的问题是数据库写入操作是否发生在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中找到.但简而言之,就是要避免循环.

Ios相关问答推荐

在带有可编码的SWIFT5中,可以轻松处理以美元符号开头的JSON密钥,例如$DATE";

AVFoundation Camera推出变焦SWIFT

如何在iOS 17中拦截UITextView中的链接点击?UITextItemInteraction已弃用

快速 keys 串更新只有在第二次try 时才起作用

更新 flutter 和 xcode 后 Xcode 14.3 中缺少文件 (libarclite_iphoneos.a)

在我的 M1 上出现 Architecture arm64 问题,因此我无法运行我的旧项目

使用 JSONDecoder 解码的对象的打印输出有问题

从 PHAssets 生成图像时,iOS 应用程序因内存问题而崩溃

在 Swift 中使用 UITesting 捕获屏幕录像

帧过渡动画有条件地工作

如何告诉 SwiftUI 视图绑定到嵌套的 ObservableObjects

UICollectionView - 动态单元格高度?

'+entityForName: nil 不是合法的 NSManagedObjectContext 参数 - 核心数据

iOS WKWebView 不显示 javascript alert() 对话框

如何使用 Contacts Framework 获取 iOS 9 中的所有联系人记录

swift 语言中的 null / nil

如何计算 Swift 数组中元素的出现次数?

AVAudioRecorder 抛出错误

闭包不能隐式捕获变异的 self 参数

如何删除UITableView中最后一个单元格的最后一个边框?