PINCache中的后臺任務(wù)

PINCache中的后臺任務(wù)

在PINCache磁盤緩存策略中际长,針對數(shù)據(jù)寫入想帅,刪除等磁盤操作,作者用了后臺任務(wù)操作队丝,用來確保磁盤操作得以順利完成。其具體是通過beginBackgroundTaskWithExpirationHandler來實(shí)現(xiàn)的欲鹏。作者對其操作進(jìn)行了封裝机久。在源碼中有一個PINBackgroundTask類,該類實(shí)現(xiàn)了向系統(tǒng)注冊后臺任務(wù)的方法赔嚎。


這里有幾點(diǎn)需要明確下:
  • 大多數(shù)情況下膘盖,我們可以在app中通過調(diào)用beginBackgroundTaskWithExpirationHandler來請求一個后臺任務(wù),通過調(diào)用endBackgroundTask來完成該請求尤误。幾乎不會在用戶按下Home鍵的時候來調(diào)用侠畔。

  • 你可以在任何時候,同時向系統(tǒng)請求多個任務(wù)损晤。這對于系統(tǒng)來說软棺,性能損耗較低,就好比引用計(jì)數(shù)一樣尤勋,只要系統(tǒng)中還有一個未完成的請求喘落,系統(tǒng)就會預(yù)留一些時間來完成它。

  • 系統(tǒng)是不能保證用戶的請求同步完成最冰。這些方法只是向系統(tǒng)請求瘦棋,系統(tǒng)仍可以忽略該請求,在需要一些額外的資源锌奴,甚至可能被系統(tǒng)然隨時殺了進(jìn)程兽狭。系統(tǒng)通常會預(yù)留約10分鐘時間來處理請求。

動手寫一個
  1. 檢查系統(tǒng)是否支持多線程任務(wù)

     if([][UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupportes)]) {
    
     }
    
  2. 向系統(tǒng)請求一個后臺任務(wù)

     __block UIBackgroundTaskIdentifier background_task;
     background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
     //This code block is execute when the application’s 
     //remaining background time reaches ZERO.}];
    
  3. 執(zhí)行自己的異步操作鹿蜀,并標(biāo)志請求完成

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
     //### background task starts
     NSLog(@"Running in the background\n");
     while(TRUE)
     {
         NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
         [NSThread sleepForTimeInterval:1]; //wait for 1 sec
     }
     //#### background task ends
    
     //Clean up code. Tell the system that we are done.
     [application endBackgroundTask: background_task];
     background_task = UIBackgroundTaskInvalid; });  
    

看看PINCache的具體實(shí)現(xiàn)
@interface PINBackgroundTask : NSObject
#if !defined(PIN_APP_EXTENSIONS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
@property (atomic, assign) UIBackgroundTaskIdentifier taskID;
#endif
+ (instancetype)start;
- (void)end;
@end

@implementation PINBackgroundTask
- (instancetype)init
{
    if (self = [super init]) {
#if !defined(PIN_APP_EXTENSIONS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
        _taskID = UIBackgroundTaskInvalid;
#endif
    }
    return self;
}

+ (instancetype)start
{
    PINBackgroundTask *task = [[self alloc] init];
#if !defined(PIN_APP_EXTENSIONS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
    task.taskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        UIBackgroundTaskIdentifier taskID = task.taskID;
        task.taskID = UIBackgroundTaskInvalid;
        [[UIApplication sharedApplication] endBackgroundTask:taskID];
    }];
#endif
    return task;
}

- (void)end
{
#if !defined(PIN_APP_EXTENSIONS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
    UIBackgroundTaskIdentifier taskID = self.taskID;
    self.taskID = UIBackgroundTaskInvalid;
    [[UIApplication sharedApplication] endBackgroundTask:taskID];
#endif
}

@end
具體使用
- (void)removeObjectForKey:(NSString *)key fileURL:(NSURL **)outFileURL
{
    if (!key)
        return;
    //創(chuàng)建一個后臺請求
    PINBackgroundTask *task = [PINBackgroundTask start];    
    NSURL *fileURL = nil;
    
    [self lock];
        fileURL = [self encodedFileURLForKey:key];
        [self removeFileAndExecuteBlocksForKey:key];
    [self unlock];
    //注銷完成該請求
    [task end];
    
    if (outFileURL) {
        *outFileURL = fileURL;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箕慧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茴恰,更是在濱河造成了極大的恐慌颠焦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往枣,死亡現(xiàn)場離奇詭異伐庭,居然都是意外死亡粉渠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門圾另,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霸株,“玉大人,你說我怎么就攤上這事集乔∪ゼ” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵扰路,是天一觀的道長尤溜。 經(jīng)常有香客問我,道長汗唱,這世上最難降的妖魔是什么宫莱? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮哩罪,結(jié)果婚禮上授霸,老公的妹妹穿的比我還像新娘。我一直安慰自己识椰,他們只是感情好绝葡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腹鹉,像睡著了一般藏畅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上功咒,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天愉阎,我揣著相機(jī)與錄音,去河邊找鬼力奋。 笑死榜旦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的景殷。 我是一名探鬼主播溅呢,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猿挚!你這毒婦竟也來了咐旧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤绩蜻,失蹤者是張志新(化名)和其女友劉穎铣墨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體办绝,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伊约,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年姚淆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屡律。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡腌逢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疹尾,到底是詐尸還是另有隱情上忍,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布纳本,位于F島的核電站,受9級特大地震影響腋颠,放射性物質(zhì)發(fā)生泄漏繁成。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一淑玫、第九天 我趴在偏房一處隱蔽的房頂上張望巾腕。 院中可真熱鬧,春花似錦絮蒿、人聲如沸尊搬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佛寿。三九已至,卻和暖如春但壮,著一層夾襖步出監(jiān)牢的瞬間冀泻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工蜡饵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弹渔,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓溯祸,卻偏偏與公主長得像肢专,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子焦辅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容