Iphone 持久化NSOperationQueue

Iphone 持久化NSOperationQueue,iphone,objective-c,Iphone,Objective C,有人知道如何在应用程序启动之间将NSOperationQueue持久化到磁盘吗?没有办法做到这一点。NSOperations是操作,是可运行代码的一部分,通常不可能持久保存到磁盘 但是,在应用程序中,您应该知道向队列中添加了哪些操作。要么使用子类,要么使用一些元数据。然后,您将以自定义方式存储元数据,即关于应该做什么的信息。应用程序启动后,现在可以从加载的元数据重新创建以前在队列中的操作 目前我几乎没有什么可以给你的,但我希望这已经有帮助了 我同意Max的观点-没有通用的方法可以做到这一点。通常

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

没有办法做到这一点。NSOperations是操作,是可运行代码的一部分,通常不可能持久保存到磁盘

但是,在应用程序中,您应该知道向队列中添加了哪些操作。要么使用子类,要么使用一些元数据。然后,您将以自定义方式存储元数据,即关于应该做什么的信息。应用程序启动后,现在可以从加载的元数据重新创建以前在队列中的操作


目前我几乎没有什么可以给你的,但我希望这已经有帮助了

我同意Max的观点-没有通用的方法可以做到这一点。通常,您希望使操作在概念上具有事务性,并与有限状态机中的状态相关联。在每个状态转换(即完成的操作)上保留当前状态和任何其他适当的数据,然后使用一段代码根据当前状态使用适当的操作填充NSOperationQueue。在重新启动应用程序时,从UI驱动的代码中调用相同的代码


与我一起工作的团队已经讨论了一段时间,讨论了一种尽可能多地实现这一点的通用方法(理想情况下是作为一个可重用的类或框架),但我们还没有走得很远。

如果您有一个相对简单的队列,操作之间没有依赖关系,那么通过利用NSCoder,这应该是非常简单的

一般做法如下:

  • 使用NSOperationQueueoperations属性遍历队列中挂起的NSOperation项。操作将按照它们添加到队列中的顺序进行,并且您希望保留顺序

  • 您的NSOperations应该进行子分类,并实现NSCoding协议,以便每个操作都知道如何使用NSArchiver对自身进行归档和取消归档。您将决定需要序列化哪些属性,以便正确恢复队列的状态。如果您已经创建了任何操作间依赖关系,那么您将负责以某种方式保存和恢复这些关系——而且,如果您的队列以这种方式很复杂,那么您可能一开始就不想这样做。序列化(归档)操作,并将其存储到NSArray或使用其他结构来保留队列顺序

  • 将包含序列化操作的NSArray归档到文件中

  • 要恢复队列,您需要从文件中“取消归档”NSArray,然后遍历操作列表,取消归档每个NSOperation,并将其相对于原始顺序添加到队列中
    非常简单,首先确保您的所有NSO操作都采用NSCoding协议,并实施方法来确定要保存和恢复哪些字段:

    肌肉手术

    @interface MyOperation : NSOperation<NSCoding>
    
    最后,可以随时序列化和反序列化队列。这将把它存储到手机的
    文档/数据文件
    中的存储器中,假设您的队列被称为
    操作

    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]);
    }
    

    你能告诉我们你想要实现什么吗?也许有比持久化NSOperationQueue更好的方法来解决您的问题。
    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]);
    }