キューの内容を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

