寫之前先聲明一下: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】