持久化NSOperationQueue

13

有人知道如何在应用程序重启之间将NSOperationQueue持久化到磁盘吗?


你能告诉我们你想要实现什么吗?也许有比持久化NSOperationQueue更好的解决问题的方法。 - hwaxxer
4个回答

10

这是不可能的。NSOperation是行动,可运行代码的部分,它们通常无法泛化地持久化到磁盘上。

但是,在你的应用程序中,你应该知道将哪些操作添加到了队列中。可以通过子类或者在周围添加一些元数据来实现。然后以自定义的方式存储这些元数据,即关于应该执行什么操作的信息。在应用程序启动时,可以从加载的元数据重新创建之前在队列中的操作。

目前我无法提供更多帮助,但希望这已经有所帮助!


7
非常简单,首先确保您的所有NSOperations都采用了NSCoding协议,并实现了方法来告诉它们想要保存和恢复哪些字段:
我的操作.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]);
}

6
我同意Max的看法 - 没有一种通用的方法来实现这一点。通常,您希望将操作概念上事务化,并与有限状态机中的状态相关联。每个状态转换(即已完成操作)都会在其上持续当前状态和任何其他适当的数据,然后有一个单一的代码块,它基于当前状态将NSOperationQueue填充为适当的操作。从UI驱动的代码中调用此相同的代码,并在重新启动应用程序时调用它。
我所在的团队已经讨论了很长时间,寻求一种尽可能多地实现此目标的通用方法(最好是可重用的类或框架),但我们还没有取得很大进展。

4
如果您有一个相对简单的队列,并且没有操作之间的依赖关系,那么通过利用NSCoder进行序列化,这应该是非常简单的。
实现此操作的一般方法如下:
1.使用NSOperationQueue的operations属性迭代队列中未完成的NSOperation项。操作将按添加到队列中的顺序排序,您将要保留此顺序。
2.您的NSOperations应该是子类,并实现了NSCoding协议,以便每个操作都知道如何使用NSArchiver进行归档和取消归档。您需要确定需要序列化哪些属性才能正确恢复队列的状态。如果您创建了任何操作之间的依赖关系,则需要负责保存和恢复这些关系 - 如果您的队列在这方面很复杂,那么您可能首先不想这样做。将操作序列化(归档),并将其存储到NSArray中或使用其他结构来保留队列顺序。
3.将包含序列化操作的NSArray归档到文件中。
4.要还原队列,您将从文件中“取消归档”NSArray,然后遍历操作列表,取消归档每个NSOperation,并将其相对于原始顺序添加到队列中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接