有没有人知道如何在应用程序启动之间将NSOperationQueue保留到磁盘?
答案 0 :(得分:10)
没有办法这样做。 NSOperations是动作,可运行代码的一部分,通常不可能持久存储到磁盘。
但是,在您的应用程序中,您应该知道添加到队列中的操作。通过使用子类或通过使用一些元数据。然后,您将以自定义方式存储元数据,即应该执行的操作的信息。在应用程序启动时,现在可以从加载的元数据中重新创建先前在队列中的操作。
目前我几乎无法给你任何其他东西,但我希望这已经有用了!
答案 1 :(得分:7)
非常简单,首先要确保你所有的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;
}
最后,随时序列化和反序列化您的队列。这将把它存储到Documents/data
文件中手机上的存储空间,假设您的队列名为operations
。
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]);
}
答案 2 :(得分:6)
我同意Max - 没有通用的方法来做到这一点。通常,您希望在概念上使操作成为事务性操作,并与有限状态机中的状态相关联。在每个状态转换(即完成的操作)上保持当前状态和任何其他适当的数据然后具有单个代码,该代码使用基于当前状态的适当操作来填充NSOperationQueue。从UI驱动的代码中调用相同的代码并重新启动应用程序。
与我一起工作的团队已经讨论了一段时间尽可能多地执行此操作的通用方法(理想情况下是可重用的类或框架),但我们还没有达到目前为止。
答案 3 :(得分:4)
如果你有一个相对简单的队列,在操作之间没有依赖关系,那么通过利用NSCoder可以非常简单。
执行此操作的一般方法如下:
使用NSOperationQueue 操作属性迭代队列中待处理的NSOperation项目。操作将按照它们添加到队列的顺序进行,您需要保留订购。
您的NSOperations应该是子类并实现NSCoding协议,以便每个操作都知道如何使用NSArchiver归档和解压缩自身。您需要确定需要序列化哪些属性才能正确恢复队列状态。如果您已经创建了任何操作间依赖关系,那么以某种方式保存和恢复这些关系将是您的责任 - 并且很可能,如果您的队列以这种方式复杂,您可能不希望首先执行此操作。序列化(存档)操作,并将其存储到NSArray或使用其他一些结构来保留队列顺序。
将包含序列化操作的NSArray存档到文件中。