iOS 后臺任務(wù)

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

那么iPhone流暢的原因是什么呢?我想很大一部分原因是iPhone嚴格的后臺運行保護機制,絕大部分程序在后臺都撐不過10分鐘,所以實際上只運行了一個程序,那肯定不卡了。

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

向iOS申請,在后臺完成一個Long-Running Task任務(wù)
1.項目的AppDelegate.h文件中

@interface AppDelegate ()

@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;

@property (nonatomic, strong) NSTimer *myTimer;

@end

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

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

注意這里不能企圖開任何的線程來調(diào)用方法,因為所有的線程都會被掛起

3、實現(xiàn)后臺任務(wù)結(jié)束的方法
后臺任務(wù)一結(jié)束,我們首先需要釋放定時器,然后告訴iOS我們的任務(wù)已經(jīng)完成了,下面是實現(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];// 停止定時器
            // 每個對 beginBackgroundTaskWithExpirationHandler:方法的調(diào)用,必須要相應的調(diào)用 endBackgroundTask:方法。這樣,來告訴應用程序你已經(jīng)執(zhí)行完成了。
            // 也就是說,我們向 iOS 要更多時間來完成一個任務(wù),那么我們必須告訴 iOS 你什么時候能完成那個任務(wù)。
            // 標記指定的后臺任務(wù)完成
            [[UIApplication sharedApplication]endBackgroundTask:self.backgroundTaskIdentifier];
            // 銷毀后臺任務(wù)標識符
            strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
        }
    });
}

// 模擬的一個 Long-Running Task 方法

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

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

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

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

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