寫(xiě)之前先聲明一下:OC是最好的語(yǔ)言捕虽!??
iPhone向來(lái)是如此的流暢慨丐,就算是我手里如此垃圾的iPhone5S,1G內(nèi)存也能聽(tīng)著歌泄私,開(kāi)著QQ房揭,聊著微信,還可以打一把王者農(nóng)藥晌端,然后還可以上來(lái)刷一刷簡(jiǎn)書(shū)的博客捅暴,好了進(jìn)入正題:
那么iPhone流暢的原因是什么呢秩彤?我想很大一部分原因是iPhone嚴(yán)格的后臺(tái)運(yùn)行保護(hù)機(jī)制奄侠,絕大部分程序在后臺(tái)都撐不過(guò)10分鐘,所以實(shí)際上只運(yùn)行了一個(gè)程序闯睹,那肯定不卡了漆羔。
不過(guò)我們目前的主題不是這個(gè)梧奢,作為開(kāi)發(fā)者的我絕對(duì)忍受不了它3秒鐘都不給我的態(tài)度????,只要一退到后臺(tái)演痒,所有線程立馬被掛起G坠臁!太傲嬌了鸟顺,既然有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];
注意這里不能企圖開(kāi)任何的線程來(lái)調(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:方法诀诊。這樣,來(lái)告訴應(yīng)用程序你已經(jīng)執(zhí)行完成了阅嘶。
// 也就是說(shuō),我們向 iOS 要更多時(shí)間來(lái)完成一個(gè)任務(wù),那么我們必須告訴 iOS 你什么時(shí)候能完成那個(gè)任務(wù)。
// 標(biāo)記指定的后臺(tái)任務(wù)完成
[[UIApplication sharedApplication]endBackgroundTask:self.backgroundTaskIdentifier];
// 銷(xiāo)毀后臺(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】