IOS 中什么是 NSOperation 和 NSOperationQueue?如何使用?

NSOperation和NSOperationQueue是iOS中用于管理任务和线程的api。
NSOperation是一个抽象类,代表一个任务或操作。它有几个具体子类:

  • NSInvocationOperation:将SEL包装为一个操作。
  • NSBlockOperation:将block包装为一个操作。
  • NSURLSessionTask:URL会话任务对应的操作。
    NSOperation定义了一个操作的生命周期,有以下状态:
  • ready:就绪,等待执行。
  • executing:正在执行。
  • finished:执行结束。
  • cancelled:被取消。
    NSOperationQueue是一个队列,用于管理和调度操作。我们可以将操作添加到队列中,让队列负责调度执行这些操作。
    使用NSOperation和NSOperationQueue的主要步骤:
  1. 创建操作(NSOperation对象)。可以使用系统定义的操作子类,也可以自定义一个子类。
  2. 创建队列(NSOperationQueue对象)。可以指定最大并发操作数。
  3. 将操作加入队列。
  4. 取消操作或暂停/恢复队列。
    示例:
// BlockOperation
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Executing op1...");
}];

// InvocationOperation 
NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self 
                                                                  selector:@selector(doSomething)
                                                                    object:nil];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op1];
[queue addOperation:op2];

[queue cancelAllOperations]; // 取消所有操作
[queue setSuspended:YES];  // 暂停队列
[queue setSuspended:NO];  // 恢复队列

IOS中实现数据持久化存储的主要方式有:

  1. NSUserDefaults。用于存储小量数据,数据存储在磁盘。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"some data" forKey:@"key1"];
[defaults synchronize];
  1. plist文件。用于存储面向对象数据,数据以xml格式保存在磁盘文件中。
NSDictionary *dict = @{@"key1":@"value1"};
[dict writeToFile:@"/path/to.plist" atomically:YES];
  1. Core Data。用于存储面向对象数据,数据存储在SQLite数据库文件中。
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "EntityName", in: context)
let object = NSManagedObject(entity: entity!, insertInto: context)
object.setValue(value, forKey: "propertyName")
try context.save() 
  1. Realm。是一个移动数据库,可以用于替代Core Data。数据存储在磁盘,查询和操作数据更简单高效。
// Define model 
class Dog: Object {
    @objc dynamic var name = ""
    @objc dynamic var age = 0
}

// Create realm 
let realm = try! Realm()

// Add object
let dog = Dog()
dog.name = "Rex"
dog.age = 1
try! realm.write {
    realm.add(dog)
}

// Query  
let results = realm.objects(Dog.self).filter("age > 0")
  1. SQLite。是一个自包含的关系型数据库,数据存储在磁盘文件,可以直接执行SQL语句操作。
sqlite3 *database;
sqlite3_open("/path/to.sqlite", &database);

sqlite3_stmt *statement;
sqlite3_prepare_v2(database, "SELECT * FROM table;", -1, &statement, NULL);

while (sqlite3_step(statement) == SQLITE_ROW) {
   // get row data
}

NSOperation和NSOperationQueue让我们可以简单且高效地管理多个任务和线程。它们是iOS开发者进行多线程编程的基石。