有人知道如何在应用程序启动之间将NSOperationQueue持久化到磁盘吗?
发布于 2010-09-05 18:40:21
没有办法做到这一点。NSOperations是动作,是可运行代码的一部分,一般不可能持久化到磁盘。
但是,在您的应用程序中,您应该知道向队列添加了哪些操作。可以使用子类,也可以使用一些元数据。然后以一种自定义的方式存储元数据,即关于应该做什么的信息。在应用程序启动时,以前在队列中的操作现在可以从加载的元数据中重新创建。
目前我几乎没有什么可以给你的了,但我希望这已经是有帮助的了!
发布于 2013-08-17 10:01:36
非常简单,首先确保您的所有NSOperations都采用NSCoding协议,并实现方法来告诉他们想要保存和重新获得哪些字段:
MyOperation.h
@interface MyOperation : NSOperation<NSCoding>MyOperation.m
#pragma mark NSCoding
#define kSomeKey @"someKey"
- (void) encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:[self someKey] forKey:kSomeKey];
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
NSString *someKey = [decoder decodeObjectForKey:kSomeKey];
[self setSomeKey:someKey];
}
return self;
}最后,随时序列化和反序列化您的队列。假设您的队列名为operations,这会将其存储到电话上的Documents/data文件中。
NSString * const dataPath = @"~/Documents/data";
// private
- (void) serializeQueue {
NSArray* storedOperations = [[self operations] operations];
[NSKeyedArchiver archiveRootObject:storedOperations toFile:[dataPath stringByExpandingTildeInPath]];
}
// private
- (void) deserializeQueue {
NSArray* storedOperations = [NSKeyedUnarchiver unarchiveObjectWithFile:[dataPath stringByExpandingTildeInPath]];
NSLog(@"count of opeations: %lu", (unsigned long) [storedOperations count]);
}发布于 2012-05-18 20:56:12
我同意Max的观点--没有一种通用的方法可以做到这一点。通常,您希望使操作在概念上是事务性的,并与有限状态机中的状态相关联。将当前状态和每个状态转换(即已完成的操作)上的任何其他适当数据持久化,然后有一段代码,该代码根据当前状态用适当的操作填充NSOperationQueue。从UI驱动的代码中调用相同的代码,并在重启应用程序时调用。
与我一起工作的团队已经讨论了一段时间,以尽可能多地完成这项工作(理想情况下,作为可重用的类或框架),但我们还没有取得很大进展。
https://stackoverflow.com/questions/3643995
复制相似问题