2013年3月22日金曜日

永続化されたジョブキューライブラリ

キューの内容をSQLiteを使い保存。登録したジョブはGCDでバックグラウンド実行される。


APIはこんな感じ。enqueueWithData:forTask:でジョブ(処理)をキューへ詰めていく。
EDQueue.h

@interface EDQueue : NSObject

@property (weak) id delegate;
@property (readonly) Boolean isRunning;
@property (readonly) Boolean isActive;
@property NSUInteger retryLimit;

+ (EDQueue *)sharedInstance;
- (void)enqueueWithData:(id)data forTask:(NSString *)task;
- (void)start;
- (void)stop;
@end


ジョブ処理例はこんな感じ。
- (EDQueueResult)queue:(EDQueue *)queue processJob:(NSDictionary *)job
{
    sleep(1);           // This won't block the main thread. Yay!

    // Wrap your job processing in a try-catch. Always use protection!
    @try {
        if ([[job objectForKey:@"task"] isEqualToString:@"success"]) {
            return EDQueueResultSuccess;
        } else if ([[job objectForKey:@"task"] isEqualToString:@"fail"]) {
            return EDQueueResultFail;
        }
    }
    @catch (NSException *exception) {
        return EDQueueResultCritical;
    }

    return EDQueueResultCritical;
}
delegateを設定しておくと上記メソッドが別スレッドで呼び出される。

アプリ終了後も処理を記憶して、次回起動時にも処理を継続したいケースに使える。


ちなみに拙作でこんなのもあります。

キューの管理だけに特化しいるので、出し入れは呼び出し側で行う必要はある。こっちも永続化あり(SQLite未使用)。UITableViewなどGUIとの連携を想定していてエントリ毎の細かい情報が取れたりする。
※ドキュメントなし&非ARC

0 件のコメント:

コメントを投稿