簡體   English   中英

堅持NSOperationQueue

[英]Persisting NSOperationQueue

有沒有人知道如何在應用程序啟動之間將NSOperationQueue保留到磁盤?

沒有辦法這樣做。 NSOperations是動作,可運行代碼的一部分,一般不可能持久存儲到磁盤。

但是,在您的應用程序中,您應該知道添加到隊列中的操作。 通過使用子類或通過使用一些元數據。 然后,您將以自定義方式存儲元數據,即應該執行的操作的信息。 在應用程序啟動時,現在可以從加載的元數據中重新創建先前在隊列中的操作。

目前我幾乎無法給你任何其他東西,但我希望這已經有用了!

非常簡單,首先要確保所有的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]);
}

我同意Max - 沒有通用的方法來做到這一點。 通常,您希望在概念上使操作成為事務性操作,並與有限狀態機中的狀態相關聯。 在每個狀態轉換(即完成的操作)上保持當前狀態和任何其他適當的數據然后具有單個代碼,其基於當前狀態用適當的操作填充NSOperationQueue。 從UI驅動的代碼和重新啟動應用程序調用相同的代碼。

我與之合作的團隊已經討論了一段時間盡可能多地執行此操作的通用方法(理想情況下是可重用的類或框架),但我們還沒有達到很遠的程度。

如果你有一個相對簡單的隊列,在操作之間沒有依賴關系,那么通過利用NSCoder可以非常簡單。

這樣做的一般方法如下:

  1. 使用NSOperationQueue 操作屬性迭代隊列中的待處理NSOperation項。 操作將按照它們添加到隊列的順序進行,您將希望保留順序。

  2. 您的NSOperations應該是子類並實現NSCoding協議,以便每個操作都知道如何使用NSArchiver歸檔和解壓縮自身。 您需要確定需要序列化哪些屬性才能正確恢復隊列狀態。 如果您已經創建了任何操作間依賴關系,那么以某種方式保存和恢復這些關系將是您的責任 - 並且很可能,如果您的隊列以這種方式復雜,您可能不希望首先執行此操作。 序列化(存檔)操作,並將其存儲到NSArray或使用其他一些結構來保留隊列順序。

  3. 將包含序列化操作的NSArray存檔到文件中。

  4. 要恢復隊列,您將從文件中“取消歸檔”NSArray,然后遍歷操作列表,取消歸檔每個NSOperation,並將其添加到相對於原始排序的隊列中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM