**:
使用nsoperation和nsoperationqueue進行多執行緒開發類似於c#中的
執行緒池,只要將乙個nsoperation(實際開中需要使用其子類nsinvocationoperation、nsblockoperation)放到nsoperationqueue這個佇列中線程就會依次啟動。
nsoperationqueue負責管理、執行所有的nsoperation
,在這個過程中可以更加容易的管理執行緒總數和控制線程之間的依賴關係。
nsoperation有兩個常用子類用於建立執行緒操作:nsinvocationoperation和nsblockoperation
,兩種方式本質沒有區別,但是是後者使用block形式進行**組織,使用相對方便。
首先使用nsinvocationoperation進行一張的載入演示,整個過程就是:建立乙個操作,在這個操作中指定呼叫方法和引數,然後加入到操作佇列。其他**基本不用修改,直接修載入方法如下:
-(下面採用nsblockoperation建立多個執行緒載入。void
)loadimagewithmultithread
//對比之前nsthread載入張很發現核心**簡化了不少,這裡著重強調兩點:// nsoperation實現多執行緒
// multithread
//// created by kenshin cui on 14-3-22.
//#import
"kcmainviewcontroller.h"
#import
"kcimagedata.h"
#define
row_count 5
#define
column_count 3
#define
row_height 100
#define
row_width row_height
#define
cell_spacing 10
@inte***ce
kcmainviewcontroller ()
@end
@implementation kcmainviewcontroller
- (void
)viewdidload
#pragma
mark 介面布局
-(void
)layoutui
}uibutton *button=[uibutton buttonwithtype:uibuttontyperoundedrect];
button.frame=cgrectmake(50, 500, 220, 25);
[button settitle:@
"載入"
forstate:uicontrolstatenormal];
//新增方法
[button addtarget:self action:@selector(loadimagewithmultithread) forcontrolevents:uicontroleventtouchupinside];
[self.view addsubview:button];
//建立鏈結
_imagenames=[nsmutablearray
array
];
for
(int
i=0; i""
,i]];
}}#pragma
mark 將顯示到介面
-(void
)updateimagewithdata:(nsdata *)data andindex:(
int
)index
#pragma
mark 請求資料
-(nsdata *)requestdata:(
int
)index
#pragma
mark 載入
-(void
)loadimage:(nsnumber *)index];
}#pragma
-(void
)loadimagewithmultithread];
// //建立操作佇列
//// [operationqueue addoperation:blockoperation];
//方法2:直接使用操佇列新增操作
[operationqueue addoperationwithblock:^];
}}@end
使用nsblockoperation方法,所有的操作不必單獨定義方法,同時解決了只能傳遞乙個引數的問題。
呼叫主線程佇列的addoperationwithblock:方法進行ui更新,不用再定義乙個引數實體(之前必須定義乙個kcimagedata解決只能傳遞乙個引數的問題)。
使用nsoperation進行多執行緒開發可以設定最大併發執行緒,有效的對執行緒進行了控制
(上面的**執行起來你會發現列印當前程序時只有有限的執行緒被建立,如上面的**設定最大執行緒數為5,則基本上是五個一次載入的)。
前面使用nsthread很難控制線程的執行順序,但是使用nsoperation就容易多了,每個nsoperation可以設定依賴執行緒。假設操作a依賴於操作b,執行緒操作佇列在啟動執行緒時就會首先執行b操作,然後執行a。對於前面優先載入最後一張圖的需求,只要設定前面的執行緒操作的依賴執行緒為最後乙個操作即可。修改載入方法如下:
-(執行效果:void
)loadimagewithmultithread];
//建立多個執行緒用於填充
for
(int
i=0; i//方法1:建立操作塊新增到佇列
//建立多執行緒操作
nsblockoperation *blockoperation=[nsblockoperation blockoperationwithblock:^];
//設定依賴操作為最後一張載入操作
[blockoperation
adddependency
:lastblockoperation];
[operationqueue addoperation:blockoperation];
}//將最後乙個的載入操作加入執行緒佇列
[operationqueue addoperation:lastblockoperation];
}
可以看到雖然載入最後一張的操作最後被加入到操作佇列,但是它卻是被第乙個執行的。操作依賴關係可以設定多個,例如a依賴於b、b依賴於c…但是千萬不要設定為迴圈依賴關係(例如a依賴於b,b依賴於c,c又依賴於a),否則是不會被執行的。
IOS 學習 多執行緒
1 不要同時開太多執行緒 1 3條 2執行緒概念 主線程 ui執行緒 不要把耗時操作放在主線程 子執行緒 一 nsthread 1 建立和啟動執行緒的三種方式 1 先建立 後啟動 建立 nsthread thread nsthread alloc initwithtarget self select...
iOS多執行緒
iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...
iOS多執行緒
iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...