NSOperation和NSOperationQueue是iOS中用于管理任务和线程的api。
NSOperation是一个抽象类,代表一个任务或操作。它有几个具体子类:
- NSInvocationOperation:将SEL包装为一个操作。
- NSBlockOperation:将block包装为一个操作。
- NSURLSessionTask:URL会话任务对应的操作。
NSOperation定义了一个操作的生命周期,有以下状态: - ready:就绪,等待执行。
- executing:正在执行。
- finished:执行结束。
- cancelled:被取消。
NSOperationQueue是一个队列,用于管理和调度操作。我们可以将操作添加到队列中,让队列负责调度执行这些操作。
使用NSOperation和NSOperationQueue的主要步骤:
- 创建操作(NSOperation对象)。可以使用系统定义的操作子类,也可以自定义一个子类。
- 创建队列(NSOperationQueue对象)。可以指定最大并发操作数。
- 将操作加入队列。
- 取消操作或暂停/恢复队列。
示例:
// 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中实现数据持久化存储的主要方式有:
- NSUserDefaults。用于存储小量数据,数据存储在磁盘。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"some data" forKey:@"key1"];
[defaults synchronize];
- plist文件。用于存储面向对象数据,数据以xml格式保存在磁盘文件中。
NSDictionary *dict = @{@"key1":@"value1"};
[dict writeToFile:@"/path/to.plist" atomically:YES];
- 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()
- 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")
- 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开发者进行多线程编程的基石。