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

正文內(nèi)容

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

2024-10-07 16:58 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 er。 main:(可選)這個(gè)方法通常用于實(shí)現(xiàn)操作對(duì)象相應(yīng)的任務(wù)。盡管可 以 在 start 方法中實(shí)現(xiàn)這些任務(wù),但是將其轉(zhuǎn)移到這里會(huì)有較好的代碼 結(jié)構(gòu) , 使得 操作對(duì)象的準(zhǔn)備工作和執(zhí)行階段分開(kāi)。 isExecuting、 isFinished:(必須)并發(fā)操作應(yīng)該建立運(yùn)行環(huán)境并且報(bào)告狀態(tài)給外面的用戶,然而,一個(gè)并發(fā)操作必須維護(hù) 一些 狀態(tài)信息,來(lái)了解何時(shí)開(kāi)啟任務(wù), 何時(shí)完成任務(wù)。這些方法的實(shí)現(xiàn)必須是線程安全的,可能與 KVO 有關(guān) [4]。 isConcurrent:重載并且返回 YES 即可。 下面 的代碼示例簡(jiǎn)單的實(shí)現(xiàn)了如何子類化一個(gè)并發(fā)的操作對(duì)象: // 子類化 NSOperation @interface MyOperation: NSOperation { BOOL executing。 BOOL finished。 } (void)pleteOperation。 @end @implementation MyOperation // 實(shí)現(xiàn) 初始化方法 (id)init { self = [super init]。 if (self) { executing = NO。 finished = NO。 } return self。 } // 重載 操作對(duì)象的并發(fā)性屬性 (BOOL)isConcurrent { return YES。 } // 重載 實(shí)現(xiàn) KVO (BOOL)isExecuting { return executing。 } (BOOL)isFinished { return finished。 } 下面 的代碼示 例為如何在 start 方法中 做 準(zhǔn)備工作, 以及 實(shí)現(xiàn) KVO: (void)start { 武漢工程大學(xué) 畢業(yè)論文 10 // 周期性 的檢查是否有取消操作發(fā)生 if ([self isCancelled]) { // 如果 當(dāng)前操作對(duì)象被取消,那么需要改變 finished 狀態(tài)信息 [self willChangeValueForKey:@”isFinished”]。 finished = YES。 [self didChangeValueForKey:@”isFinished”]。 // 當(dāng) 取消操作發(fā)生時(shí), 需要 直接返回 return。 } // 當(dāng) 操作對(duì)象沒(méi)有被取消時(shí), 開(kāi)始 執(zhí)行任務(wù) [self willChangeValueForKey:@”isExecuting”]。 // 開(kāi)啟單獨(dú) 的 線程 并執(zhí)行任務(wù) [NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil]。 // 這個(gè) 時(shí)候任務(wù)已經(jīng)開(kāi)始了, 需要 改變 executing狀態(tài) executing = YES。 [self didChangeValueForKey:@”isExecuting”]。 } 當(dāng) 編寫完操作對(duì)象的準(zhǔn)備階段的 start 方法后, 就 可以開(kāi)始編寫 main方法, 將 start方法和 main方法 分開(kāi) 使得 代碼有清晰的結(jié)構(gòu), 有助于 調(diào)試和 Debug。 在 main方法 中,當(dāng) 操作對(duì)象的狀態(tài)改變時(shí), 仍需 實(shí)現(xiàn)對(duì)象的 KVO 規(guī)則, 如下 : (void)main { @try { // 開(kāi)始 執(zhí)行有關(guān)操作的 主任務(wù) // 執(zhí)行完成 后調(diào)用完成操作 [self pleteOperation]。 } @catch(… ) { // 仍然 無(wú)需 拋出異常 } } (void)pleteOperation { [self willChangeValueForKey:@”isFinished”]。 [self willChangeValueForKey:@”isExecuting”]。 // 在 任務(wù)完成后, 需要 更改對(duì) 應(yīng) 的狀態(tài)信息 executing = NO。 finished = YES。 [self didChangeValueForKey:@” isFinished”]。 [self didChangeValueForKey:@” isExecuting”]。 } 保證 KVO 規(guī)則 NSOperation 對(duì)于以下屬性實(shí)現(xiàn) KVO: isCancelled、 isConcurrent、 isExecuting、isFinished、 isReady、 dependencies、 queuePriority、 pletionBlock。 如果對(duì) NSOperation重 寫了 start 方法或者做了其他一些重大的定制,除了重載 main武漢工程大學(xué) 畢業(yè)論文 11 方法,還需要確保自定義對(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ì)象 的執(zhí)行行為 成功建 操作對(duì)象后,在將其添加到隊(duì)列之前,可以對(duì)操作對(duì)象進(jìn)行配置。這一節(jié)中所描述的配置類型既可以應(yīng)用于自定義的繼承于 NSOperation類 的子類,也可應(yīng)用于系統(tǒng)提供的子類。 配置操作對(duì)象之間的依賴關(guān)系 依賴關(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 通知。 更改操作執(zhí)行的優(yōu)先級(jí) 對(duì)于添加到隊(duì)列的 操作對(duì)象 ,執(zhí)行順序首先取決于已經(jīng)入隊(duì)操作對(duì)象的準(zhǔn)備情況,然后取決于其優(yōu)先級(jí)。準(zhǔn)備情況取決于操作對(duì)象依賴的其他對(duì)象,但是優(yōu)先級(jí)是操作對(duì)武漢工程大學(xué) 畢業(yè)論文 12 象自身的屬性,默認(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í)。 開(kāi)始執(zhí)行操作對(duì)象 當(dāng)操作對(duì)象初始化并且配置完成后,需要執(zhí)行它們來(lái)完成程序中的工作。 更改操作執(zhí)行的優(yōu)先級(jí) 到目前為止,執(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)系仍然是最適合的方式。 手動(dòng)實(shí)行操作對(duì)象 盡管操作隊(duì)列可以很方便 地 執(zhí)行操作對(duì)象,但是有時(shí)候仍希望不通過(guò)操作隊(duì)列來(lái)執(zhí)行某些操作對(duì)象,下面是一些手動(dòng)執(zhí)行需要注意的地方,最重要的是必須要保證其準(zhǔn)備好執(zhí)行 然后 調(diào)用其 start 方法。 武漢工程大學(xué) 畢業(yè)論文 13 操作對(duì)象不會(huì) 在 isReady 方法返回 YES 之前執(zhí)行 , isReady 方法取決于其依賴的對(duì)象是否全部執(zhí)行完畢。 手動(dòng)執(zhí)行時(shí)必須顯示調(diào)用其 start 方法,不能使用 main或者其他方法,因?yàn)?start 方法在真正運(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ì)象的執(zhí)行 一旦 操作對(duì)象添加到操作隊(duì)列后,將由操作隊(duì)列高效 地 管理并且不能被移除,唯一出隊(duì)的方式就是取消它,可以通過(guò)調(diào)用其 cancel 方法取消單個(gè)的操作對(duì)象,也可以調(diào) 用操作隊(duì)列的 cancelAllOperation 方法取消隊(duì)列中所有的操作對(duì)象。 武漢工程大學(xué) 畢業(yè)論文 14 只有在確定不再需要時(shí)才取消它,取消其實(shí)相當(dāng)于操作對(duì)象已經(jīng)完成,如果被依賴項(xiàng)被取消,那么這個(gè)依賴關(guān)系就不再成立了。 等待 操作 對(duì)象執(zhí)行完成 為了 程序 有更出色 的 表現(xiàn),應(yīng)該讓操作對(duì)象盡可能的并發(fā), 好讓 程序能夠去做別的事情,如果創(chuàng)建
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1