freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

ios平臺下并發(fā)編程的研究和實現(xiàn)畢業(yè)論文-文庫吧

2025-07-12 08:25 本頁面


【正文】 列一樣,開發(fā)者只需定義需要執(zhí)行的任務(wù)然后將其添加到操作隊列中,操作隊列將負(fù)責(zé)任務(wù)的調(diào)度和執(zhí)行。跟 GCD 一樣,操作隊列處理所有線程管理的工作,并且高效地執(zhí)行任務(wù)代碼。下面主要介紹iOS平臺中異步編程的幾種技術(shù)。 Queue調(diào)度隊列是一種基于C語言的自定義任務(wù)執(zhí)行機制。調(diào)度隊列串行或并行地執(zhí)行任務(wù),任務(wù)開始執(zhí)行的順序與其添加順序一致。串行的調(diào)度隊列同一時間只能執(zhí)行單個任務(wù),需要等待上個任務(wù)完成后才可以開始下個任務(wù)的執(zhí)行。并行的調(diào)度隊列在同一時間內(nèi)可以執(zhí)行多個任務(wù),并不需要等待上個任務(wù)完成。調(diào)度隊列具有以下優(yōu)點:1. 簡潔明了的編程接口。2. 自動全面的線程池管理方案。3. 可提供調(diào)度組件的速度。4. 更好的內(nèi)存利用率(因為線程棧不處于應(yīng)用程序本身內(nèi)存區(qū))。5. 任務(wù)的異步調(diào)用不會導(dǎo)致死鎖。6. 競爭條件下?lián)碛懈线m的粒度。7. 串行隊列提供了更加有效的同步機制。提交到調(diào)度隊列中的任務(wù)必須封裝為block對象或者是一個函數(shù),調(diào)度隊列是GCDGCD和C運行時的一部分。 Sources調(diào)度源是用于異步處理特殊系統(tǒng)類型事件的基于C語言的機制。一個調(diào)度源封裝特殊系統(tǒng)類型事件的相關(guān)信息,當(dāng)發(fā)生該事件時,向調(diào)度隊列提交函數(shù)或特殊的block對象。簡單來說,調(diào)度源是一個監(jiān)視某些類型事件的對象。當(dāng)這些事件發(fā)生時,它自動將一個block對象放入一個調(diào)度隊列的執(zhí)行例程中??梢允褂谜{(diào)度源來監(jiān)聽以下系統(tǒng)事件:計時器、信號處理描述符相關(guān)的進程事件、Mach 端口事件和自定義的觸發(fā)事件[2]。 Queues操作隊列由iOS中NSOperationQueue類實現(xiàn)。相比較調(diào)度隊列按照添加順序執(zhí)行任務(wù),操作隊列在決定任務(wù)執(zhí)行順序時還會考慮其他一系列因素。提交到操作隊列的對象必須是NSOperation類的子類,NSOperation子類的對象封裝執(zhí)行的任務(wù)以及所需的數(shù)據(jù)。在考慮將現(xiàn)有的代碼重新設(shè)計以支持并發(fā)時,首先應(yīng)該確認(rèn)是否有這個必要。一般來說,并發(fā)將大多數(shù)耗時任務(wù)放至其他工作線程執(zhí)行,可以使得主線程空閑。由于iOS中有關(guān)UI部分的事件都在主線程中處理,因此空閑的主線程能夠更加有效地處理相應(yīng)用戶事件,使得界面更加流暢,提升用戶體驗,同時還能利用多核特性做更多的工作。當(dāng)然,引入并發(fā)也會增加開銷和代碼量,增加編碼和Debug難度。由于增加了軟件設(shè)計的復(fù)雜性,并發(fā)并不是產(chǎn)品開發(fā)周期快結(jié)束時需要加入的一個功能點。每一個程序都有不同的需求和指導(dǎo)任務(wù),可以大概通過以下幾點來確認(rèn)是否應(yīng)該引入并發(fā)。在考慮程序中引入并發(fā)前,首先應(yīng)該從明確程序正確的行為開始。了解程序預(yù)期的行為,在之后的設(shè)計中可以幫助驗證設(shè)計的可行性。第一件事,就是羅列出程序所有要做的任務(wù)以及相關(guān)的數(shù)據(jù)結(jié)構(gòu)。一開始,可能會從用戶的點擊事件任務(wù)開始,因為用戶點擊事件提供了很清晰的需求,用戶點擊了哪里,期望得到什么樣的行為。實際中更應(yīng)該羅列其他無需用戶交互的應(yīng)用程序任務(wù),比如基于計時器的任務(wù)。當(dāng)整理出較高級別任務(wù)的列表后,將任務(wù)再分解為完成所需的一系列步驟,在這個階段,應(yīng)該是主要是對數(shù)據(jù)或者對象做一些修改,以及了解這些修改如何影響程序的整體狀態(tài)。還應(yīng)該注意對象和數(shù)據(jù)結(jié)構(gòu)之間的依賴關(guān)系,注意對一個對象的修改是否影響其他對象。在羅列程序任務(wù)時,應(yīng)該基本明確哪些任務(wù)并發(fā)處理時會高效一些。如果整個任務(wù)中更改了某些步驟的執(zhí)行順序,任務(wù)執(zhí)行結(jié)果會改變,那么可能需要考慮串行執(zhí)行這些步驟。如果任務(wù)的執(zhí)行結(jié)果與任務(wù)中步驟的執(zhí)行順序無關(guān),那么可以使用并發(fā)來提高性能。這種情況下,將任務(wù)拆分出一步一步執(zhí)行的單元,然后將它們封裝成block或者Operation對象并分發(fā)到對應(yīng)的隊列。在確定任務(wù)中的每個執(zhí)行單元時,一開始不需要過多的擔(dān)心工作量是不是太大。即使開啟線程需要一定的開銷,但是調(diào)度隊列和操作隊列的一個優(yōu)點就是在多數(shù)情況下仍比傳統(tǒng)使用線程的方式開銷要小的多。所以,在使用隊列執(zhí)行一些很小的工作單元時,效率是高于使用線程的。當(dāng)然,仍需要通過衡量實際運行時的效率來調(diào)整任務(wù)的大小,但是在一開始,沒必要考慮任務(wù)單元是不是拆分得太小了?,F(xiàn)在已經(jīng)將任務(wù)拆分為工作單元,并且用block或者NSOperation對象封裝起來了。如果使用block封裝任務(wù),可以向一個串行或并行的隊列添加block來執(zhí)行。如果對于執(zhí)行順序有特殊的要求,應(yīng)該使用串行的隊列。如果工作單元對于執(zhí)行順序沒有要求,可以使用并發(fā)的隊列或者多個不同的并發(fā)隊列,具體取決于程序需求。如果使用NSOperation對象,那么配置對象將比選擇隊列更加重要。想要串行地執(zhí)行NSOperation對象,必須要先處理這些對象之間的依賴關(guān)系。依賴項會阻止當(dāng)前操作繼續(xù)執(zhí)行,直到所依賴的對象完成它們的工作。調(diào)度隊列、操作隊列和調(diào)度源都提供了簡單的并發(fā)編程方式。然而這些技術(shù)并不能保證一定能夠提高程序的性能或改善代碼的執(zhí)行效率。因此仍然需要以一種合理的方式去使用并發(fā),且不能過度的使用操作系統(tǒng)資源。在代碼中引用并發(fā)之前,無論是使用隊列還是線程,都應(yīng)該采集一些基準(zhǔn)的性能指標(biāo)反映當(dāng)前的程序性能。當(dāng)使用并發(fā)后,采集并發(fā)后的性能指標(biāo)與之前的基準(zhǔn)進行比較,看并發(fā)的引入是否提高了程序性能,推薦使用性能測試工具來檢測。雖然操作隊列和調(diào)度隊列是執(zhí)行并發(fā)的首選方式,但這并不是適用于任何情況的。根據(jù)應(yīng)用程序任務(wù)需求的不同,有時候可能仍需創(chuàng)建自定義的線程。如果的確有這個需要,那么盡可能使用更少的線程,盡量不要使用線程做其他的操作。線程仍然是實現(xiàn)代碼運行在確定時間的最佳方式,調(diào)度隊列盡管會盡可能快速地執(zhí)行任務(wù),但是仍然不能解決真實時間約束。如果需要了解更多線程運行在后臺的預(yù)計行為,線程通常會提供更好的選擇。不過,使用線程時最好再次確認(rèn)其必要性。第三章 操作隊列在iOS平臺中,Cocoa 框架中的 NSOperation 通過面向?qū)ο蟮姆绞椒庋b了執(zhí)行異步操作的工作,主要用于 Operation Queue。本章節(jié)主要介紹 NSOperation 類的使用以及自定義子類化。Operation對象是NSOperation類的實例,用來封裝程序中需要異步執(zhí)行的一些操作。NSOperation是抽象基類,所以不能直接使用,需要通過繼承實現(xiàn)自己的子類來執(zhí)行任務(wù)。由于基類本身已經(jīng)實現(xiàn)了一些基本操作,所以可以很方便地繼承它。除此之外,Cocoa 框架還提供了兩個已經(jīng)定義好的子類,用于一些常用的異步操作,可以在代碼中直接使用它們[3]。第一個子類為NSInvocationOperation,基于一個方法選擇子和對象創(chuàng)建的對象,當(dāng)程序中已經(jīng)存在現(xiàn)有的方法,并且希望異步執(zhí)行時,是一個較好的選擇。第二個子類為NSBlockOperation,可以使用這個類并發(fā)地執(zhí)行一個或多個block對象。當(dāng)所有相關(guān)的block執(zhí)行完畢后,operation對象才完成。當(dāng)上面提供的兩個類不能滿足需求時,可以考慮定義自己的NSOperation子類。這樣可以獲得更多有關(guān)操作對象的控制權(quán),通常用于一些比較復(fù)雜的操作。所有的操作對象都支持以下重要的功能:,這些依賴項會阻止當(dāng)前對象的運行,直到對象所依賴的其他項都完成。 block,當(dāng)操作對象的主任務(wù)完成時調(diào)用。,需要操作對象使用 KVO。,會影響操作對象的執(zhí)行順序。,正在執(zhí)行時也可以取消。操作對象旨在提高程序的并發(fā)性,同時也是一種很好的封裝應(yīng)用程序行為的方式。應(yīng)該提交操作對象到操作隊列上,讓它們在單獨的線程或者多個線程上執(zhí)行相應(yīng)的工作,而不是在主線程上做大量的操作。 NSOperation類為所有的操作對象提供了一些基本的子類化點。同時提供了大量的基礎(chǔ)方法用于實現(xiàn)KVO依賴,然而,有時候仍需補充現(xiàn)有的基礎(chǔ)結(jié)構(gòu),來確保業(yè)務(wù)的正常運行。其他一些額外的工作量取決于是否實現(xiàn)并發(fā)操作。定義非并發(fā)的操作要比并發(fā)簡單的多,對于非并發(fā)的操作,只需要執(zhí)行主要任務(wù)并實現(xiàn)取消方法。對于并發(fā)操作,必須重載現(xiàn)有的一些代碼,下面各節(jié)主要講述重載的內(nèi)容。每個操作對象至少需要實現(xiàn)初始化和主任務(wù)這兩個方法,通過這兩個方法,操作對象可以實例化并且得到一個需要執(zhí)行的任務(wù)。代碼示例如下:@interface CWNonConcurrentOperation : NSOperation@property id (strong) data。(id)initWithData:(id)data。@end@implementation CWNonConcurrentOperation (id)initWithData:(id)data { if (self = [super init]) { myData = data。 } return self。}// 主任務(wù)(void)main { @try { // 根據(jù)當(dāng)前操作對象的數(shù)據(jù)進行處理,得出結(jié)果 } @catch(...) { // 不要在這里拋出異常}} @end當(dāng)操作對象開始執(zhí)行后,只有顯示地取消時,才會真正結(jié)束執(zhí)行。取消操作可以發(fā)生在任何時間,甚至在操作對象還未開始執(zhí)行時。盡管NSOperation抽象基類已經(jīng)提供了取消操作,但是應(yīng)該在子類中重載它,并在取消操作中釋放已經(jīng)占有的資源。操作對象應(yīng)該在整個執(zhí)行周期中檢查是否有取消事件發(fā)生,并且優(yōu)雅地處理該事件。支持取消需要做的就是在代碼中周期性的調(diào)用操作對象的 isCancelled 方法,并且當(dāng)不返回YES時立刻返回。支持取消操作是很重要的,isCancelled方法調(diào)用返回非???,因此可以頻繁的調(diào)用而不會造成額外的開銷??赡苄枰谝韵碌胤秸{(diào)用isCancelled方法:1. 在執(zhí)行任何自然操作時立刻調(diào)用。2. 在循環(huán)中至少調(diào)用一次,或者當(dāng)循環(huán)耗時較長時調(diào)用多次。3. 任何可能中斷操作的地方。默認(rèn)情況下操作隊列以同步方式執(zhí)行,也就是說它們在調(diào)用start方法的線程上執(zhí)行任務(wù)。操作隊列為非并發(fā)的任務(wù)提供了線程,不過現(xiàn)在大多數(shù)操作需要異步運行,因此需要重載一些方法。下面列出了并發(fā)執(zhí)行時需要重載的方法:start :(必須)所有的并發(fā)操作必須重載這個方法,實現(xiàn)自定義的行為。通過調(diào)用start方法手動執(zhí)行操作。因此,這個方法的實現(xiàn)是操作開始執(zhí)行的起點,并且是設(shè)置線程或者其他運行環(huán)境的地方。需要注意的是任何時候都不能調(diào)用super。main:(可選)這個方法通常用于實現(xiàn)操作對象相應(yīng)的任務(wù)。盡管可以在start方法中實現(xiàn)這些任務(wù),但是將其轉(zhuǎn)移到這里會有較好的代碼結(jié)構(gòu),使得操作對象的準(zhǔn)備工作和執(zhí)行階段分開。isExecuting、isFinished:(必須)并發(fā)操作應(yīng)該建立運行環(huán)境并且報告狀態(tài)給外面的用戶,然而,一個并發(fā)操作必須維護一些狀態(tài)信息,來了解何時開啟任務(wù),何時完成任務(wù)。這些方法的實現(xiàn)必須是線程安全的,可能與KVO有關(guān)[4]。isConcurrent:重載并且返回YES即可。下面的代碼示例簡單的實現(xiàn)了如何子類化一個并發(fā)的操作對象:// 子類化 NSOperation@interface MyOperation: NSOperation { BOOL executing。 BOOL finished。} (void)pleteOperation。@end@implementation MyOperation// 實現(xiàn)初始化方法 (id)init { self = [super init]。 if (self) { executing = NO。 finished = NO。 } return self。}// 重載操作對象的并發(fā)性屬性 (BOOL)isConcurrent { return YES。}// 重載實現(xiàn) KVO (BOOL)isExecuting { return executing。} (BOOL)isFinished { return finished。}下面的代碼示例為如何在start方法中做準(zhǔn)備工作,以及實現(xiàn)KVO: (void)start {// 周期性的檢查是否有取消操作發(fā)生if ([self isCancelled]) { // 如果當(dāng)前操作對象被取消,那么需要改變finished狀態(tài)信息 [self willChangeValueForKey:@”isFinished”]。 finished = YES。 [self didChangeValueForKey:@”isFinished”]。 // 當(dāng)取消操作發(fā)生時,需要直接返回 return。}// 當(dāng)操作對象沒有被取消時,開始執(zhí)行任務(wù)[self willChangeValueForKey:@”isExecuting”]。// 開啟單獨的線程并執(zhí)行任務(wù)[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil]。// 這個時候任務(wù)已經(jīng)開始了,需要改變executing狀態(tài)executing = YES。[self didChangeValueForKey:@”isExecuting”]。}當(dāng)編寫完操作對象的準(zhǔn)備階段的start方法后,就可以開始編寫main方法,將start方法和main方法分開使得代碼有清晰的結(jié)構(gòu),有助于調(diào)試和Debug。在main方法中,當(dāng)操作對象的狀態(tài)改變時,仍需實現(xiàn)對象的KVO規(guī)則,如下: (void)main { @try { // 開始執(zhí)行有關(guān)操作的主任務(wù) // 執(zhí)行完成后調(diào)用完成操作 [self pleteOperation]。 } @catch(…) { // 仍然無需拋出異常 }} (void)pleteOperation { [self willChangeValueForKey:@”isFinished”]。 [self wi
點擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1