【移動應(yīng)用開發(fā)技術(shù)】iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之三_第1頁
【移動應(yīng)用開發(fā)技術(shù)】iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之三_第2頁
【移動應(yīng)用開發(fā)技術(shù)】iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之三_第3頁
【移動應(yīng)用開發(fā)技術(shù)】iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之三_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】iOS使用多線程提高數(shù)據(jù)并發(fā)訪問之三

如何編寫多線程應(yīng)用現(xiàn)在你已經(jīng)知道一個好的多線程應(yīng)用是怎樣的,它是如何幫助你解決問題的,那么如何編寫一個好的多線程應(yīng)用呢?我會向你介紹iPhone應(yīng)用中編寫和處理多線程應(yīng)用的主要技術(shù)。創(chuàng)建一個線程為了創(chuàng)建一個線程,你可以使用下面的方法:NSThreadPOSIXThreadsNSObject來創(chuàng)建一個新的線程N(yùn)SOperation和NSOperationQueue我會逐一介紹他們,然后會舉一些例子,因?yàn)樗麄兌加懈髯缘膬?yōu)點(diǎn)和缺點(diǎn)。在本部分結(jié)束的時候,我會給出一個表格來進(jìn)行對比,是得你能夠分清他們的不同,這樣在你的需求中就能夠選擇一個正確的方案。NSThread用NSThread創(chuàng)建一個新的線程,你可以簡單的調(diào)用:[NSThreaddetachNewThreadSelector:@selector(threadMethod:)toTarget:selfwithObject:nil];這個方法會在你的應(yīng)用中創(chuàng)建一個新的detached線程。一個detached線程就是它的所有資源會被系統(tǒng)回收,當(dāng)線程存在的時候。有些屬性你需要知道。+(void)detachNewThreadSelector:(SEL)aSelectortoTarget:(id)aTargetwithObject:(id)anArgumentaSelector:當(dāng)線程開始的時候,這個方法會在目標(biāo)對象中被調(diào)用。根據(jù)蘋果的文檔,這個selector只有一個參數(shù),沒有返回值。aTarget:將要執(zhí)行在aSelector參數(shù)中所指定的方法的對象。anArgument:唯一的一個參數(shù);當(dāng)線程開始的時候,它會被傳遞到aSelector方法中。如果你想創(chuàng)建一個線程,但是不想啟動它,你可以使用下面的機(jī)制:NSThread*myThread=[[NSThreadalloc]initWithTarget:selfselector:@selector(myThreadMainMethod:)object:nil];[myThreadstart];//Actuallycreatethethread你可以看到,第一行,你創(chuàng)建了一個新的線程,然后,根據(jù)你的選擇,你可以在對象上調(diào)用start來啟動一個新的線程。這是非常有用的,如果你只想傳遞myThread對象,而不想傳遞selector,target和argument的話。另一個比較好的做法是,使用NSThread對象發(fā)送一個消息給線程對象-(void)performSelector:(SEL)aSelectoronThread:(NSThread*)thrwithObject:(id)argwaitUntilDone:(BOOL)wait這個方法會在另一個線程上queueselector。當(dāng)系統(tǒng)自動運(yùn)行線程時,線程會dequeue這個消息,然后會調(diào)用aSelector變量指定的方法。使用POSIX線程這個在iPhone應(yīng)用中主要是用c編程時會用到。在第9章,我會更深入的討論c編程,并能夠幫助你在很多情況下提升你的iPhoneapps的性能。所以這個部分可能不會幫助你太多,如果你還不了解c編程的話。如果你已經(jīng)了解了c編程,Listing6-3展示了代碼,后面會有一個解釋。Listing6–3.POSIXThread#include<assert.h>#include<pthread.h>void*ThreadMethod(void*data){

//Yourmainlogiccomeshere.

returnNULL;}voidLaunchThread(){

//CreatethethreadusingPOSIXroutines.

pthread_attr_tattr;

pthread_tposixThreadID;

intreturnVal;

//initandcheckifinitanewthreadsuccessful

returnVal=

pthread_attr_init(&attr);

assert(!returnVal);

//setattributedetachstatefornewthread

returnVal=pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

assert(!returnVal);

//createandrunthenewthread

intthreadError=pthread_create(&posixThreadID,&attr,&ThreadMethod,NULL);

returnVal=pthread_attr_destroy(&attr);

assert(!returnVal);

if(threadError!=0)

{

//Reportanerror.

}}NSObject所有的對象都可以創(chuàng)建和detach一個新的線程來執(zhí)行這些對象的selectors。你可以使用下面的這行代碼在后臺線程中運(yùn)行doSomething方法:[myObjperformSelectorInBackground:@selector(doSomething)withObject:nil];調(diào)用這個方法的效果和下面的這行代碼是一樣的:[NSThreaddetachNewThreadSelector:@selector(doSomething)toTarget:myObjwithObject:nil]這個方法是比較好的,對于detach和創(chuàng)建一個運(yùn)行后臺任務(wù)的線程來說。NSOperationQueueNSOperationQueue是管理和運(yùn)行并發(fā)任務(wù)的一個機(jī)制。NSOperationQueue的一個好處是它能夠限制系統(tǒng)內(nèi)部并發(fā)operations的數(shù)量,通過給定一個限制使得系統(tǒng)加載在一個可以接受的范圍水平。因?yàn)檫@個最大線程數(shù)量的限制,如果有更多的線程實(shí)例,NSOperationQueue不會導(dǎo)致更多的并發(fā)線程同時在系統(tǒng)中運(yùn)行。你可以在queue中添加operations,但是不能刪除。然而,你可以在queue中取消所有已經(jīng)存在的和還沒有運(yùn)行的operations。表格6-2展示了當(dāng)使用NSOperationQueue時,一些非常有用的方法。你可以用3個不同的類來使用NSOperationQueue。NSInvocationOperation:如果你已經(jīng)有一個對象和一個方法加入到一個并發(fā)線程中,這只是一個簡單的包裹。它不需要子類,所以通過這個類來創(chuàng)建一個簡單的NSOperation對象。NSInvocationOperation是NSOperation的子類。NSBlockOperation:這是另一包裹類,用來執(zhí)行一個或多個blocks,而不需要創(chuàng)建一個單獨(dú)的NSOperation對象來執(zhí)行每一個block。當(dāng)執(zhí)行超過一個block時,只有所有內(nèi)部的blocks都執(zhí)行完畢,那么NSBlockOperation才被認(rèn)為結(jié)束了。CustomNSOperation:NSOperation是一個基類。通過繼承它,你能夠完全的控制整個NSOperation對象的實(shí)現(xiàn),包括你的operation執(zhí)行說的默認(rèn)行為和報(bào)告它的狀態(tài)。使用NSOperationQueue進(jìn)行多線程設(shè)計(jì),你需要用這3個方法中的一個來創(chuàng)建指定的對象,然后把新創(chuàng)建的NSOperation加入到你的queue中。然后這個queue會為你維護(hù)和運(yùn)行這些operations。這里有一個簡單的代碼來幫助你創(chuàng)建一個NSOperationQueue,然后把相互獨(dú)立的operation對象放進(jìn)去,來創(chuàng)建一個多線程環(huán)境:NSOperationQueue*myOperationQueue=[[NSOperationQueuealloc]init];[myOperationQueueaddOperation:myOpe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論