キューの内容をSQLiteを使い保存。登録したジョブはGCDでバックグラウンド実行される。
APIはこんな感じ。enqueueWithData:forTask:でジョブ(処理)をキューへ詰めていく。
EDQueue.h @interface EDQueue : NSObject @property (weak) iddelegate; @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