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