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

正文內(nèi)容

ios平臺(tái)下并發(fā)編程的研究和實(shí)現(xiàn)畢業(yè)論文(編輯修改稿)

2024-08-23 08:25 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 llChangeValueForKey:@”isExecuting”]。 // 在任務(wù)完成后,需要更改對(duì)應(yīng)的狀態(tài)信息 executing = NO。finished = YES。 [self didChangeValueForKey:@” isFinished”]。 [self didChangeValueForKey:@” isExecuting”]。}NSOperation 對(duì)于以下屬性實(shí)現(xiàn) KVO:isCancelled、isConcurrent、isExecuting、isFinished、isReady、dependencies、queuePriority、pletionBlock。如果對(duì)NSOperation重寫了start方法或者做了其他一些重大的定制,除了重載main方法,還需要確保自定義對(duì)象仍然保證了KVO規(guī)則。如果想要實(shí)現(xiàn)對(duì)其他操作對(duì)象依賴項(xiàng)的支持,可以重載isReady方法,直到自定義的依賴項(xiàng)已經(jīng)滿足,不然一直返回NO(這里應(yīng)該調(diào)用super),當(dāng)狀態(tài)改變時(shí),通過(guò)發(fā)出KVO通知告知狀態(tài)的改變。除非你重寫 addDependency 或 removeDependency 方法,不然無(wú)需操心dependencies的KVO規(guī)則[5]。盡管可以生成其他key的 KVO,但是最好不要這樣做。如果需要取消操作對(duì)象,只需調(diào)用其cancel方法即可,同樣,整個(gè)過(guò)程可能不需要修改隊(duì)列優(yōu)先級(jí)。最后,除非操作對(duì)象會(huì)動(dòng)態(tài)改變isConcurrent屬性,不然無(wú)需實(shí)現(xiàn)其KVO規(guī)則。成功建操作對(duì)象后,在將其添加到隊(duì)列之前,可以對(duì)操作對(duì)象進(jìn)行配置。這一節(jié)中所描述的配置類型既可以應(yīng)用于自定義的繼承于NSOperation類的子類,也可應(yīng)用于系統(tǒng)提供的子類。依賴關(guān)系是一種序列化不同操作對(duì)象的方式。一個(gè)對(duì)象依賴于其他對(duì)象的執(zhí)行狀態(tài),只有當(dāng)其依賴的對(duì)象全部完成時(shí),它自己才可以開(kāi)始執(zhí)行。因此,可以使用依賴關(guān)系來(lái)創(chuàng)立復(fù)雜的執(zhí)行順序。使用NSOperation類的addDependency:方法創(chuàng)建兩個(gè)對(duì)象之間的依賴關(guān)系。這個(gè)方法創(chuàng)建一個(gè)從當(dāng)前對(duì)象到目標(biāo)對(duì)象單向的依賴關(guān)系,其返回結(jié)果可以作為一個(gè)參數(shù)來(lái)傳遞。這種依賴性表示當(dāng)前的對(duì)象只有在目標(biāo)對(duì)象完成時(shí)才可以開(kāi)始執(zhí)行。這種依賴關(guān)系并不局限于同一個(gè)隊(duì)列中的操作對(duì)象,因?yàn)椴僮鲗?duì)象本身管理自己的依賴項(xiàng),所以,完全可以在不同隊(duì)列中的不同操作對(duì)象之間創(chuàng)建依賴關(guān)系。需要注意的是,不要產(chǎn)生循環(huán)依賴的關(guān)系。當(dāng)所有的依賴項(xiàng)都已經(jīng)完成時(shí),當(dāng)前操作對(duì)象將準(zhǔn)備開(kāi)始執(zhí)行(當(dāng)重載isReady方法后,這個(gè)狀態(tài)需要使用自己創(chuàng)建的標(biāo)準(zhǔn))。如果對(duì)象已經(jīng)處于隊(duì)列中,那么隊(duì)列可能隨時(shí)開(kāi)始執(zhí)行這個(gè)對(duì)象,如果是手動(dòng)管理對(duì)象的執(zhí)行,那么需要調(diào)用操作對(duì)象的start方法。應(yīng)該總是在操作對(duì)象運(yùn)行之前或者添加到隊(duì)列之前配置它的依賴關(guān)系,在運(yùn)行之后添加依賴關(guān)系可能會(huì)無(wú)效。依賴關(guān)系依賴于每個(gè)對(duì)象當(dāng)狀態(tài)變化時(shí)發(fā)送KVO通知,當(dāng)自定義對(duì)象的這種行為時(shí),為了避免出錯(cuò),可能需要在代碼中生成對(duì)應(yīng)的KVO通知。對(duì)于添加到隊(duì)列的操作對(duì)象,執(zhí)行順序首先取決于已經(jīng)入隊(duì)操作對(duì)象的準(zhǔn)備情況,然后取決于其優(yōu)先級(jí)。準(zhǔn)備情況取決于操作對(duì)象依賴的其他對(duì)象,但是優(yōu)先級(jí)是操作對(duì)象自身的屬性,默認(rèn)情況下,所有新創(chuàng)建的操作對(duì)象都有一個(gè)默認(rèn)的優(yōu)先級(jí),但可以通過(guò)setQueuePriority方法增大或者減小優(yōu)先級(jí)。優(yōu)先級(jí)只適用于同一個(gè)隊(duì)列中的不同對(duì)象,如果程序中有多個(gè)操作隊(duì)列,每個(gè)對(duì)象在不同的隊(duì)列中的優(yōu)先級(jí)是相互獨(dú)立的。因此,低優(yōu)先級(jí)的操作對(duì)象可能在不同的隊(duì)列中執(zhí)行得比高優(yōu)先級(jí)的操作對(duì)象要早。優(yōu)先級(jí)不是依賴關(guān)系的替代,優(yōu)先級(jí)只影響某個(gè)隊(duì)列中已經(jīng)做好執(zhí)行準(zhǔn)備的操作對(duì)象,舉個(gè)例子,如果一個(gè)隊(duì)列中,存在已經(jīng)準(zhǔn)備好的兩個(gè)不同優(yōu)先級(jí)的對(duì)象,那么首先執(zhí)行高優(yōu)先級(jí)的,但如果高優(yōu)先級(jí)的還未準(zhǔn)備好,低優(yōu)先級(jí)的已經(jīng)準(zhǔn)備好了,那么首先會(huì)執(zhí)行低優(yōu)先級(jí)的,如果想要使某個(gè)操作對(duì)象必須在另一個(gè)操作對(duì)象執(zhí)行完畢之后才執(zhí)行,那么應(yīng)該使用依賴關(guān)系而不是優(yōu)先級(jí)。當(dāng)操作對(duì)象初始化并且配置完成后,需要執(zhí)行它們來(lái)完成程序中的工作。到目前為止,執(zhí)行操作對(duì)象最簡(jiǎn)單的方式就是將其添加到一個(gè)操作隊(duì)列,應(yīng)用程序本身負(fù)責(zé)創(chuàng)建和維護(hù)需要使用的操作隊(duì)列。程序可以擁有多個(gè)操作隊(duì)列,但如果太多會(huì)有限制。操作隊(duì)列與系統(tǒng)根據(jù)內(nèi)核和系統(tǒng)負(fù)載,決定某一時(shí)刻維持多少并發(fā)的數(shù)量,因此,創(chuàng)建太多的操作隊(duì)列不一定能夠立即執(zhí)行其中的操作對(duì)象。創(chuàng)建隊(duì)列與創(chuàng)建其他對(duì)象的方式一樣。可以使用addOperation:方法添加操作對(duì)象,同時(shí)還可以使用 addOperationWithBlock:方法添加block,所有這些方法均進(jìn)隊(duì)一個(gè)操作對(duì)象并開(kāi)始執(zhí)行。大多數(shù)情況下,操作對(duì)象會(huì)在添加到隊(duì)列后就開(kāi)始執(zhí)行,但是仍然還有其他一些原因可能會(huì)導(dǎo)致操作對(duì)象被推遲執(zhí)行。例如某個(gè)操作對(duì)象依賴于其他操作對(duì)象的完成,或者操作隊(duì)列本身是被掛起的,亦或是操作數(shù)超過(guò)了隊(duì)列設(shè)置的最大并發(fā)數(shù)。一定要注意當(dāng)操作對(duì)象添加到操作隊(duì)列后,不能去改變它,你可以使用NSOperation類的其他方法來(lái)查看它當(dāng)前的狀態(tài)。盡管操作隊(duì)列是并發(fā)的,但是仍然可以通過(guò)設(shè)置其最大并發(fā)數(shù)為1使其強(qiáng)制串行執(zhí)行,盡管同一時(shí)間只有一個(gè)操作對(duì)象執(zhí)行,但是其執(zhí)行順序仍然受其他因素的影響,因此串行的操作隊(duì)列并不能提供像GCD一樣的行為,如果串行隊(duì)列中操作對(duì)象之間的執(zhí)行順序很重要,那么使用依賴關(guān)系仍然是最適合的方式。盡管操作隊(duì)列可以很方便地執(zhí)行操作對(duì)象,但是有時(shí)候仍希望不通過(guò)操作隊(duì)列來(lái)執(zhí)行某些操作對(duì)象,下面是一些手動(dòng)執(zhí)行需要注意的地方,最重要的是必須要保證其準(zhǔn)備好執(zhí)行然后調(diào)用其start方法。操作對(duì)象不會(huì)在isReady方法返回YES之前執(zhí)行,isReady方法取決于其依賴的對(duì)象是否全部執(zhí)行完畢。手動(dòng)執(zhí)行時(shí)必須顯示調(diào)用其start方法,不能使用main或者其他方法,因?yàn)閟tart方法在真正運(yùn)行前做了一些檢查,尤其是start方法中實(shí)現(xiàn)了有關(guān)KVO通知的生成,保證了其他對(duì)象正確的依賴狀態(tài),此方法同時(shí)還保證了在取消之后不去執(zhí)行或者沒(méi)有準(zhǔn)備好執(zhí)行時(shí)拋出異常。如果程序中定義了一些并發(fā)的操作對(duì)象,那么應(yīng)該考慮在加載之前調(diào)用其isConcurrent方法,當(dāng)它返回NO時(shí),就能夠決定是在當(dāng)前線程同步執(zhí)行操作對(duì)象還是開(kāi)啟另一個(gè)線程。下面的例子簡(jiǎn)單的示范了手動(dòng)執(zhí)行操作對(duì)象時(shí)的一些檢查工作,當(dāng)方法返回NO時(shí),應(yīng)該考慮實(shí)現(xiàn)定時(shí)器來(lái)重復(fù)調(diào)用直到返回YES。 (BOOL)performOperation:(NSOperation *)anOp{ BOOL ranIt = NO。 // 檢查操作對(duì)象的狀態(tài) if ([anOp isReady] amp。amp。 ![anOp isCancelled]) { // 當(dāng)操作對(duì)象準(zhǔn)備好并且沒(méi)有被取消時(shí) if(![anOp isConcurrent]) { // 操作對(duì)象為串行執(zhí)行時(shí),直接調(diào)用start方法 [anOp start]。 }else { [NSThread detachNewThreadSelector:@selector(start) toTarget:anOp withObject:nil]。 } ranIt = YES。}else if ([anOp isCancelled]) { // 操作對(duì)象被取消,需要發(fā)出KVO通知并且改變執(zhí)行狀態(tài) [self willChangeValueForKey:@”isFinished”]。 [self willChangeValueForKey:@”isExecuting”]。 executing = NO。finished = YES。 [self didChangeValueForKey:@” isFinished”]。 [self didChangeValueForKey:@” isExecuting”]。 ranIt = YES。}return ranIt。}一旦操作對(duì)象添加到操作隊(duì)列后,將由操作隊(duì)列高效地管理并且不能被移除,唯一出隊(duì)的方式就是取消它,可以通過(guò)調(diào)用其cancel方法取消單個(gè)的操作對(duì)象,也可以調(diào)用操作隊(duì)列的cancelAllOperation方法取消隊(duì)列中所有的操作對(duì)象。只有在確定不再需要時(shí)才取消它,取消其實(shí)相當(dāng)于操作對(duì)象已經(jīng)完成,如果被依賴項(xiàng)被取消,那么這個(gè)依賴關(guān)系就不再成立了。為了程序有更出色的表現(xiàn),應(yīng)該讓操作對(duì)象盡可能的并發(fā),好讓程序能夠去做別的事情,如果創(chuàng)建操作對(duì)象的代碼同時(shí)需要等待執(zhí)行完成來(lái)處理執(zhí)行結(jié)果,可以調(diào)用waitUntilFinished方法。但是盡量避免使用這個(gè)方法。永遠(yuǎn)不能在程序主線程中等待操作對(duì)象完成,應(yīng)該在工作線程或者其他操作對(duì)象中等待,因?yàn)樽枞骶€程會(huì)使程序遲鈍。除了等待單個(gè)操作對(duì)象完成,也可以等待整個(gè)操作隊(duì)列完成,然后可以繼續(xù)向其添加操作對(duì)象。如果需要暫停某個(gè)操作對(duì)象的執(zhí)行,可以使用隊(duì)列的setSuspended方法,掛起隊(duì)列不會(huì)影響已經(jīng)執(zhí)行的操作對(duì)象,只會(huì)暫停新添加到隊(duì)列中的操作對(duì)象。第四章 調(diào)度隊(duì)列在iOS平臺(tái)中,GCD 調(diào)度隊(duì)列是執(zhí)行任務(wù)的強(qiáng)大工具,可以使用同步或異步方式執(zhí)行任意的代碼塊。調(diào)度隊(duì)列可以執(zhí)行幾乎所有的單線程代碼。相比于線程級(jí)別代碼,其更易于使用,且效率要高。本章節(jié)將介紹調(diào)度隊(duì)列,以及如何使用它執(zhí)行大多數(shù)任務(wù)。調(diào)度隊(duì)列是在程序中執(zhí)行同步或異步代碼的比較簡(jiǎn)單的一種方式,任務(wù)就是程序中需要執(zhí)行的一些簡(jiǎn)單的工作,例如執(zhí)行一些計(jì)算,創(chuàng)建或修改一個(gè)數(shù)據(jù)結(jié)構(gòu),從文件中讀取數(shù)據(jù)并進(jìn)行處理等等這樣的一些工作。通過(guò)在函數(shù)或block中寫入相應(yīng)的代碼來(lái)定義任務(wù),然后將其添加至調(diào)度隊(duì)列開(kāi)始執(zhí)行。調(diào)度隊(duì)列是一種類似對(duì)象的結(jié)構(gòu),它管理提交到它上的任務(wù)。所有的調(diào)度隊(duì)列都是先進(jìn)先出的,因此任務(wù)開(kāi)始執(zhí)行的順序與添加順序一致。GCD已經(jīng)提供了一些常用的調(diào)度隊(duì)列,也可以根據(jù)自己的需求創(chuàng)建自定義調(diào)度隊(duì)列。當(dāng)程序中引入并發(fā)性時(shí),相比較線程而言,調(diào)度隊(duì)列提供了幾個(gè)特有的優(yōu)勢(shì)。最直接的優(yōu)勢(shì)就是簡(jiǎn)單的工作隊(duì)列以及編程模型。使用線程時(shí),不僅需要編寫執(zhí)行任務(wù)所需的代碼,還需創(chuàng)建和管理自己創(chuàng)建的線程。調(diào)度隊(duì)列能夠讓開(kāi)發(fā)者更加專注于任務(wù)的處理,而無(wú)需擔(dān)心線程的管理和創(chuàng)建。相反,操作系統(tǒng)會(huì)做所有線程相關(guān)創(chuàng)建和管理的工作。相比于應(yīng)用程序本身,操作系統(tǒng)能夠更加高效地管理線程,系統(tǒng)能夠根據(jù)可用的資源以及當(dāng)前的并發(fā)線程數(shù)量,動(dòng)態(tài)地?cái)U(kuò)展正在運(yùn)行線程的數(shù)量。此外,系統(tǒng)提供的線程通常會(huì)比自己創(chuàng)建的線程更快地開(kāi)始執(zhí)行。使用調(diào)度隊(duì)列編碼要比線程簡(jiǎn)單的多,其編碼的關(guān)鍵是設(shè)計(jì)能夠異步執(zhí)行且資源就緒的任務(wù)。然而,調(diào)度隊(duì)列還有個(gè)優(yōu)點(diǎn)是可預(yù)測(cè)性,如果有兩個(gè)不同的線程需要存取同一份資源,那么每個(gè)線程都有可能先修改這份資源,所以需要使用鎖來(lái)保證兩個(gè)線程不會(huì)同時(shí)修改這份資源。而使用調(diào)度隊(duì)列時(shí),可以將這兩個(gè)任務(wù)添加進(jìn)同一條串行隊(duì)列來(lái)確保同時(shí)只有一個(gè)任務(wù)可以修改資源。這種基于同步機(jī)制的隊(duì)列要比鎖的效率更高一些,因?yàn)殒i不管是不是在競(jìng)爭(zhēng)條件下都需要一個(gè)昂貴的內(nèi)核中斷。而調(diào)度隊(duì)列運(yùn)行在自己的程序空間中,只有在必要時(shí)才會(huì)中斷內(nèi)核。下面是調(diào)度隊(duì)列其他一些需要重點(diǎn)關(guān)注的地方:1. 所有調(diào)度隊(duì)列同時(shí)執(zhí)行它們隊(duì)列中的任務(wù),只有單個(gè)隊(duì)列中才會(huì)執(zhí)行序列化的任務(wù)。2. 系統(tǒng)決定同一時(shí)間類可以執(zhí)行任務(wù)的總數(shù)。3. 系統(tǒng)在選取新的任務(wù)執(zhí)行時(shí)會(huì)考慮隊(duì)列的優(yōu)先級(jí)。 4. 添加到隊(duì)列的任務(wù)必須滿足可以執(zhí)行的條件,比如資源就緒等。下面列出了幾種調(diào)度隊(duì)列,并相應(yīng)做了簡(jiǎn)要的說(shuō)明。(Serial Queue)串行隊(duì)列,也稱私有調(diào)度隊(duì)列,執(zhí)行順序?yàn)槿蝿?wù)添加的順序。當(dāng)前正在執(zhí)行的任務(wù)運(yùn)行在別的線程上(具體跟任務(wù)類型有關(guān)),并且由調(diào)度隊(duì)列直接進(jìn)行管理。串行隊(duì)列經(jīng)常用來(lái)執(zhí)行一些同步操作,比如對(duì)于指定資源的存取。(Concurrent Queue)并行隊(duì)列,也稱全局隊(duì)列,可以同時(shí)執(zhí)行一個(gè)或多個(gè)任務(wù)。但任務(wù)仍然按照添加的順序執(zhí)行,當(dāng)前的任務(wù)運(yùn)行在不同的線程上,這些線程由調(diào)度隊(duì)列管理。某個(gè)時(shí)刻正在執(zhí)行的任務(wù)數(shù)量是變化的,取決于操作系統(tǒng)當(dāng)前的狀態(tài)。在iOS 5以后,可以指定調(diào)度隊(duì)列類型為 DISPATCH_QUEUE_CONCURRENT來(lái)創(chuàng)建自己的并發(fā)調(diào)度隊(duì)列,除此之外,系統(tǒng)已經(jīng)提供了四個(gè)預(yù)先定義的調(diào)度隊(duì)列供使用。(Main Dispatch Queue)主調(diào)度隊(duì)列是全局可用的串行隊(duì)列,在程序的主線程上執(zhí)行任務(wù)。與應(yīng)用程序的其他事件執(zhí)行交織在一起加入到主線程的RunLoop中。由于隊(duì)列運(yùn)行在主線程中,所以經(jīng)常用作一些關(guān)鍵的同步點(diǎn)。盡管不需要?jiǎng)?chuàng)建自己的主隊(duì)列,但是需要確保程序能夠在主線程中快速地執(zhí)行完所添加的任務(wù),因?yàn)楹臅r(shí)的操作會(huì)阻塞UI,使得程序變得卡頓。除了調(diào)度隊(duì)列外,GCD還提供了有關(guān)使用隊(duì)列編碼的一些技術(shù),具體如下:Dispatch Group:用來(lái)觀察一組block對(duì)象的完成。它提供了一種非常有用的同步機(jī)制,依賴其他任務(wù)的完成。Dispatch semaphores:類似于傳統(tǒng)的信號(hào)量,通常要高效一些。只有當(dāng)信號(hào)量不可用,調(diào)用線程需阻塞時(shí),Dispatch semaphores才會(huì)調(diào)起內(nèi)核。Dispatch Source:對(duì)特定類型的系統(tǒng)事件生成通知,可以使用Dispatch Source來(lái)觀察類似進(jìn)程通知、信號(hào)或描述符事件等等。當(dāng)監(jiān)聽(tīng)的事件發(fā)生時(shí),Dispatch Source異步地提交任務(wù)代碼到指定的隊(duì)列中去處理。block是基于C的語(yǔ)言功能,所以可以在C、ObjectiveC、C++中使用它。block能夠很容易地定義一個(gè)自包含的工作單元,盡管看起來(lái)類似于函數(shù)指針,其實(shí)是用底層的數(shù)據(jù)結(jié)構(gòu)表示,它類似于對(duì)象,并由編譯器創(chuàng)建和管理。編譯器將打包block中的代碼,將其封裝為可以生存在堆上的形式,并且能夠在程序中作為參數(shù)傳遞。block一個(gè)很重要的優(yōu)點(diǎn)就是能夠引用自己作用域外的變量,當(dāng)在函數(shù)或方法中創(chuàng)建block時(shí),它在某種程度上類似于傳統(tǒng)的代碼塊。例如,block可以讀取上層作用域中的變量。在block中訪問(wèn)變量會(huì)將其復(fù)制到堆上,以便于之后對(duì)該變量的訪問(wèn)(棧上的變
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1