iOS 后臺(tái)任務(wù)

寫之前先聲明一下:OC是最好的語言!??
iPhone向來是如此的流暢,就算是我手里如此垃圾的iPhone5S,1G內(nèi)存也能聽著歌,開著QQ,聊著微信,還可以打一把王者農(nóng)藥,然后還可以上來刷一刷簡(jiǎn)書的博客,好了進(jìn)入正題:

那么iPhone流暢的原因是什么呢?我想很大一部分原因是iPhone嚴(yán)格的后臺(tái)運(yùn)行保護(hù)機(jī)制,絕大部分程序在后臺(tái)都撐不過10分鐘,所以實(shí)際上只運(yùn)行了一個(gè)程序,那肯定不卡了。

不過我們目前的主題不是這個(gè),作為開發(fā)者的我絕對(duì)忍受不了它3秒鐘都不給我的態(tài)度????,只要一退到后臺(tái),所有線程立馬被掛起?。√翄闪?,既然有10分鐘,那么就一定要爭(zhēng)取到!上代碼:

向iOS申請(qǐng),在后臺(tái)完成一個(gè)Long-Running Task任務(wù)
1.項(xiàng)目的AppDelegate.h文件中

@interface AppDelegate ()

@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;

@property (nonatomic, strong) NSTimer *myTimer;

@end

2、在 AppDelegate 的 applicationDidEnterBackground 方法中調(diào)用我們需要后臺(tái)執(zhí)行的方法:

self.backgroundTaskIdentifier =[application beginBackgroundTaskWithExpirationHandler:^(void) {
        //當(dāng)后臺(tái)時(shí)間要結(jié)束的時(shí)候就會(huì)調(diào)用這個(gè)Block
        //此時(shí)我們需要結(jié)束后臺(tái)任務(wù),
        [self endBackgroundTask];
    }];
// 模擬一個(gè)Long-Running Task
    self.myTimer =[NSTimer scheduledTimerWithTimeInterval:1.0f
                                                   target:self
                                                 selector:@selector(timerMethod:)
                                                 userInfo:nil
                                                  repeats:YES];

注意這里不能企圖開任何的線程來調(diào)用方法,因?yàn)樗械木€程都會(huì)被掛起

3、實(shí)現(xiàn)后臺(tái)任務(wù)結(jié)束的方法
后臺(tái)任務(wù)一結(jié)束,我們首先需要釋放定時(shí)器,然后告訴iOS我們的任務(wù)已經(jīng)完成了,下面是實(shí)現(xiàn)部分:

- (void) endBackgroundTask{
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    AppDelegate *weakSelf = self;
    dispatch_async(mainQueue, ^(void) {
        AppDelegate *strongSelf = weakSelf;
        if (strongSelf != nil){
            [strongSelf.myTimer invalidate];// 停止定時(shí)器
            // 每個(gè)對(duì) beginBackgroundTaskWithExpirationHandler:方法的調(diào)用,必須要相應(yīng)的調(diào)用 endBackgroundTask:方法。這樣,來告訴應(yīng)用程序你已經(jīng)執(zhí)行完成了。
            // 也就是說,我們向 iOS 要更多時(shí)間來完成一個(gè)任務(wù),那么我們必須告訴 iOS 你什么時(shí)候能完成那個(gè)任務(wù)。
            // 標(biāo)記指定的后臺(tái)任務(wù)完成
            [[UIApplication sharedApplication]endBackgroundTask:self.backgroundTaskIdentifier];
            // 銷毀后臺(tái)任務(wù)標(biāo)識(shí)符
            strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
        }
    });
}

// 模擬的一個(gè) Long-Running Task 方法

- (void) timerMethod:(NSTimer *)paramSender{
    
    // backgroundTimeRemaining 屬性包含了程序留給的我們的時(shí)間
    NSTimeInterval backgroundTimeRemaining =[[UIApplication sharedApplication]backgroundTimeRemaining];
    
    if (backgroundTimeRemaining == DBL_MAX){
        
        NSLog(@"Background Time Remaining = Undetermined");
        
    } else {
        
        NSLog(@"Background Time Remaining = %.02f Seconds", backgroundTimeRemaining);
        
    }
}

到這里后臺(tái)任務(wù)就算執(zhí)行成功了,不會(huì)一退到后臺(tái)就會(huì)被掛起,附上demo地址:【下載demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容