Android热某、iOS 關(guān)于后臺(tái)處理

1.Android四大組件之Server


特色:

  • 提供后臺(tái)長(zhǎng)期運(yùn)行服務(wù)(如復(fù)雜計(jì)算菩鲜、下載园细、遠(yuǎn)程消息通知等等)
  • 長(zhǎng)生命周期、沒(méi)有用戶(hù)界面接校、在后臺(tái)運(yùn)行


    Service類(lèi)型詳細(xì)介紹

2. ISO的GCD與后臺(tái)處理進(jìn)程

GCD為Grand Central Dispatch的縮寫(xiě)猛频。
Grand Central Dispatch (GCD)是Apple開(kāi)發(fā)的一個(gè)多核編程的較新的解決方法。它主要用于優(yōu)化應(yīng)用程序以支持多核處理器以及其他對(duì)稱(chēng)多處理系統(tǒng)蛛勉。它是一個(gè)在線(xiàn)程池模式的基礎(chǔ)上執(zhí)行的并行任務(wù)鹿寻。在Mac OS X 10.6雪豹中首次推出,也可在IOS 4及以上版本使用诽凌。

先來(lái)了解幾個(gè)概念

  • 任務(wù)(Task):任務(wù)指的是當(dāng)前需要處理的一項(xiàng)工作
  • 線(xiàn)程(Thread):線(xiàn)程是程序執(zhí)行流的最小單元毡熏。它是程序中一個(gè)單一的順序控制流程,在單個(gè)程序中可以同時(shí)運(yùn)行多個(gè)線(xiàn)程侣诵,分別完成不同的工作痢法,這就形成了多個(gè)線(xiàn)程。
  • 進(jìn)程(Process):進(jìn)程可以認(rèn)為是當(dāng)前正在運(yùn)行的程序杜顺,它通常由多個(gè)線(xiàn)程組成财搁。

IOS開(kāi)發(fā)中,多線(xiàn)程開(kāi)發(fā)工具主要有:NSThread(屬于線(xiàn)程)躬络、NSOperation & NSOperationQueue尖奔、Pthreads、GCD

2.1 Dispatch object 和 Dispatch queue的概念

  1. Dispatch object

GCD對(duì)象被稱(chēng)為Dispatch object洗鸵。Dispatch object和其他的object-c對(duì)象一樣是采用引用計(jì)數(shù)機(jī)制的越锈,不過(guò)它有自己的引用、釋放函數(shù)膘滨。它使用dispatch_retain和dispatch_release函數(shù)來(lái)進(jìn)行內(nèi)存管理甘凭。(ARC模式下自動(dòng)釋放)

  1. Dispatch queue

Dispatch queue是一個(gè)對(duì)象,它可以接受任務(wù)火邓,并將任務(wù)以先到先執(zhí)行的順序來(lái)執(zhí)行丹弱。dispatch queue可以是并發(fā)的或串行的。并發(fā)任務(wù)會(huì)基于系統(tǒng)負(fù)載來(lái)合適地并發(fā)進(jìn)行铲咨,串行隊(duì)列同一時(shí)間只執(zhí)行單一任務(wù)躲胳。

GCD:有以下三種隊(duì)列類(lèi)型:

  • Main queue:主隊(duì)列和主線(xiàn)程(Main Thread)功能相同。實(shí)際上纤勒,提交至主隊(duì)列的任務(wù)會(huì)在主線(xiàn)程中執(zhí)行坯苹。Main queue可以調(diào)用dispatch_get_main_queue來(lái)獲得,主要負(fù)責(zé)UI相關(guān)的工作摇天。
  • Global queues:全局隊(duì)列是并發(fā)隊(duì)列粹湃,一次可以運(yùn)行多個(gè)任務(wù)恐仑,分為高、中(默認(rèn))和低三個(gè)優(yōu)先級(jí)隊(duì)列为鳄。調(diào)用dispatch_get_global_queue函數(shù)傳入優(yōu)先級(jí)來(lái)訪(fǎng)問(wèn)隊(duì)列裳仆。
  • Private queue:用戶(hù)隊(duì)列,通過(guò)dispatch_queue_create函數(shù)創(chuàng)建孤钦。這些隊(duì)列是串行的歧斟,一次只能運(yùn)行一個(gè)任務(wù)。
//例子:點(diǎn)擊下載圖片

#define kDownloadQueue "KDownloadQueue"
#define kImgUrl @"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png"
- (IBAction)btnAction:(id)sender {
    [self downloadImageFrom:kImgUrl Completion:^{
        self.tipLabel.text = @"下載完畢";
    }];
}
-(void)downloadImageFrom:(NSString *)url Completion:(void(^)(void))completion{
    //創(chuàng)建自定義隊(duì)列
    dispatch_queue_t downloadQueue = dispatch_queue_create(kDownloadQueue, NULL);
    //為了保證線(xiàn)程安全偏形,用一個(gè)局部變量來(lái)保存要訪(fǎng)問(wèn)的變量值
    dispatch_async(downloadQueue, ^{
        //下載圖片静袖,下載成功返回NSData對(duì)象
        NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:kImgUrl]];
        if(imageData){
            //關(guān)于UI的更新只能在主線(xiàn)程里進(jìn)行
            dispatch_async(dispatch_get_main_queue(), ^{
                //把NSData對(duì)象轉(zhuǎn)化為UIImage對(duì)象
                UIImage *image = [UIImage imageWithData:imageData];
                self.imageView.image = image;
                //操作結(jié)束,在主隊(duì)列中執(zhí)行回調(diào)
                dispatch_async(dispatch_get_main_queue(), completion);
            });
        }
    });
    //釋放自定義隊(duì)列
//    dispatch_release(downloadQueue);
}

2.2 線(xiàn)程(NSThread)

  • 創(chuàng)建線(xiàn)程的兩種方式:實(shí)例發(fā)和class方法
//實(shí)例
NSThread *thread = [[NSThread alloc] initWithTarget:self  selector:@selector(work) object:nil];
[thread start];

//class方法
[NSThread detachNewThreadSelector:@selector(work) toTarget:self withObject:nil];
  • 同步與加鎖
- (void)viewDidLoad {
//    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSLog(@"cc2didLoad");
    totalAmounts = 100;//假設(shè)100張票
    soldAmounts = 0;
    
}
- (IBAction)workAction:(id)sender {
    [self work];
}
-(void)work{
    NSLog(@"work");
    condition = [[NSCondition alloc]init];//初始化鎖對(duì)象
    //初始化線(xiàn)程1
    thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(sellTicket) object:nil];
    [thread1 setName:@"Thread1"];
    [thread1 start];
    
    //初始化線(xiàn)程2
    thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(sellTicket) object:nil];
    [thread2 setName:@"T2222222222"];
    [thread2 start];
}
-(void)sellTicket{
    NSLog(@"sellTicket");
    //通過(guò)循環(huán)壳猜,模擬買(mǎi)票場(chǎng)景
    while (1) {
        [condition lock];//上鎖
        //還沒(méi)賣(mài)完勾徽,繼續(xù)買(mǎi)票
        if(totalAmounts - soldAmounts > 0){
            //線(xiàn)程暫停0.5秒,模擬用戶(hù)買(mǎi)票場(chǎng)景
            [NSThread sleepForTimeInterval:0.1];
            soldAmounts += 1; //模擬已經(jīng)買(mǎi)到一張票
            NSLog(@"[線(xiàn)程:%@]剩余%d張票统扳,已經(jīng)售出%d張",[[NSThread currentThread]name],totalAmounts-soldAmounts,soldAmounts);
        }else{
            //所有票賣(mài)完喘帚,跳出循環(huán)
            break;
        }
        [condition unlock];//解鎖
    }
}
  • 與主線(xiàn)程交互
[self performSelectorOnMainThread:@selector(fresh) withObject:nil waitUntilDone:NO];
//參數(shù)一:執(zhí)行刷新工作的函數(shù),
//參數(shù)二:fresh形參咒钟,可以傳遞nil
//參數(shù)三:No吹由,表示不阻塞

2.3后臺(tái)處理進(jìn)程

  • Task completion
- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self backgroundHandler];
}
- (void)backgroundHandler {
    
    NSLog(@"### -->backgroundinghandler");
    UIApplication *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(),^{
            if( bgTask != UIBackgroundTaskInvalid){
                bgTask = UIBackgroundTaskInvalid;
            }
        });
        NSLog(@"====任務(wù)完成了。朱嘴。倾鲫。。萍嬉。乌昔。。壤追。磕道。。行冰。溺蕉。。悼做。疯特。===>");
         [app endBackgroundTask:bgTask];
        
    }];
    
    // Start the long-running task
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        while (true) {
            NSLog(@"httptool .....");
            sleep(1);
        } 
    });
}
參考:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子邻吞,更是在濱河造成了極大的恐慌庶灿,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吃衅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡腾誉,警方通過(guò)查閱死者的電腦和手機(jī)徘层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)利职,“玉大人趣效,你說(shuō)我怎么就攤上這事≈硖埃” “怎么了跷敬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)热押。 經(jīng)常有香客問(wèn)我西傀,道長(zhǎng),這世上最難降的妖魔是什么桶癣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任拥褂,我火速辦了婚禮,結(jié)果婚禮上牙寞,老公的妹妹穿的比我還像新娘饺鹃。我一直安慰自己,他們只是感情好间雀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布悔详。 她就那樣靜靜地躺著,像睡著了一般惹挟。 火紅的嫁衣襯著肌膚如雪茄螃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天匪煌,我揣著相機(jī)與錄音责蝠,去河邊找鬼。 笑死萎庭,一個(gè)胖子當(dāng)著我的面吹牛霜医,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驳规,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肴敛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起医男,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤砸狞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后镀梭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刀森,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年报账,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了研底。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡透罢,死狀恐怖榜晦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羽圃,我是刑警寧澤乾胶,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站朽寞,受9級(jí)特大地震影響识窿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脑融,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一腕扶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吨掌,春花似錦半抱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至秋茫,卻和暖如春史简,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肛著。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工圆兵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枢贿。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓殉农,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親局荚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子超凳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容