坚持NSOperationQueue

Byt*_*ock 12 iphone objective-c

有没有人知道如何在应用程序启动之间将NSOperationQueue保留到磁盘?

Max*_*ann 10

没有办法这样做.NSOperations是动作,可运行代码的一部分,一般不可能持久存储到磁盘.

但是,在您的应用程序中,您应该知道添加到队列中的操作.通过使用子类或通过使用一些元数据.然后,您将以自定义方式存储元数据,即应该执行的操作的信息.在应用程序启动时,现在可以从加载的元数据中重新创建先前在队列中的操作.

目前我几乎无法给你任何其他东西,但我希望这已经有用了!


pfr*_*ank 7

非常简单,首先要确保所有的NSOperations都采用NSCoding协议,并实现方法来告诉他们想要保存哪些字段并重新获得:

MyOperation.h

@interface MyOperation : NSOperation<NSCoding>
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

最后,随时序列化和反序列化队列.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]);
}
Run Code Online (Sandbox Code Playgroud)


Nei*_*all 6

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

我与之合作的团队已经讨论了一段时间尽可能多地执行此操作的通用方法(理想情况下是可重用的类或框架),但我们还没有达到很远的程度.