您好,登錄后才能下訂單哦!
現在,我將會向你更深入的介紹如何使用之前提到的方法來創建新的operations。
NSInvocationOperation
當一個新的NSInvocationOperation對象創建時,它是用來運行指定的一個方法。你可能會想要使用這個對象,如果
在你的應用中你想避免創建過多的自定義operation類。
你正在添加或維護一個已經存在的應用,而它的類都已經定義好了,同時你不想修改NSOperation的子類。
selector能夠根據用戶的輸入進行改變。在這種情況下,你只需要用一個已經選擇好的selector創建一個新的NSInvocationOperation對象。
創建一個NSInvocationOperation對象的代碼如下:
NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(myTaskMethod:) object:data];
這個和使用NSThread創建和detach一個新的線程類似。你傳遞一個目標對象,你想要調用的selector,還有在執行時selector想要使用的參數。
NSBlockOperation
NSBlockOperation是NSOperation的另一個子類。當你創建一個block operation時,你必須在這個operation 對象內至少添加一個block。之后你可以在這個operation對象內添加更多的block來執行。當operation queue執行這個block operation時,它會在這個block operation結束之前執行這個block operation內的所有blocks。因此,你可以使用這個operation對象來跟蹤一組blocks,然后你可以合并會處理相關結果。
創建一個block operation對象,你可以使用下面的代碼:
NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
NSLog(@"Beginning operation.\n");
// Do some work.
}];
然后你可以在這個operation中添加另一個block:
[theOp addExecutionBlock:[NSBlockOperation blockOperationWithBlock: ^{
NSLog(@"Beginning operation.\n");
// Do some work.
}];
NSOperation
NSOperation是用來被繼承的一個類。要繼承NSOperation,你可以使用兩種推薦的方法來創建。
自定義初始化方法:可以在這個類中接收數據和進行一些必要的邏輯處理。例如,你可以在init方法中接收一個url來下載圖片,類似這樣:
- (id)initWithData:(id)data {
if ((self = [super init]))
myData = data;
return self;
}
main方法:這是一個必須的方法,當任務啟動時被調用。
為了得到一個并發的NSOperation子類,你必須重寫更多的方法來幫助NSOperationQueue對象來處理調用者的多線程請求。
start或main:你需要重寫這個方法或main方法,當線程啟動你的operations時,能夠執行你的邏輯。默認,這個方法沒有做任何事情,除了調用main方法。因此,你可以重寫這個方法或main方法。
isExecuting或isFinished:你的operation需要報告它當前的狀態給外面的客戶端。有兩個最重要的狀態就是:你的operation已經開始執行,你的operation已經執行完畢。因此你需要在這里通過使用屬性或實例變量來跟蹤和報告這些狀態。
isConcurrent:你必須重寫這個方法,然后返回YES。
其他方法不是強制性的,但是你可能經常會需要他們。
其他邏輯處理方法:除非你想把所有的代碼都放在main方法中,你同樣需要其他的方法來包含你的邏輯處理代碼。
Listing 6-4 顯示了一個自定義和并發的NSOperation類的完整代碼。
Listing 6-4 展示了如何編寫一個自定義的NSOperation,使用多線程來從網絡下載一張圖片。
注意:如果你之前做過java編程,你會發現NSOperation和Thread類或Runnable接口很像。在Thread類中,你可以繼承Thread類,然后重寫run方法。對于Runnable接口也一樣,你需要實現Runnable接口,然后重寫run方法。你可以看到,NSoperation的main方法和Thread類,Runnable接口的run方法是一樣的。 |
配置一個線程
你可以使用一些選項來配置你的線程,這樣你就可以使用系統資源而不需要重載他們,尤其是在受限的運行時環境中,比如iPhone。
棧的大小:無論何時創建一個線程,OS會給線程的棧分配一個默認大小的內存來執行。如果你不知道棧是什么,你可以查看第5章。線程內部的棧會保存局部變量和線程執行時的方法。為了設置線程的棧大小,你需要在detaching線程之前設置。對于NSThread,這意味著你要使用初始化方法:
NSThread* myThread = [[NSThread alloc]initWithTarget:self
selector:@selector(myThreadMainMethod:)object:nil];
[myThread setStackSize:40960]; // 40KB here, the size is in bytes and multiple of 4KB
[myThread start]; // Actually create the thread
線程局部存儲:沒一個線程都有一個鍵值對的字典來存儲數據,它能夠在線程內部的任何地方訪問。你可以使用這個字典來存儲數據,還可以垮線程來呈現數據,而不需要在代碼中創建全局變量。你可以使用[aThread threadDictionary]來調用字典。
線程優先級:線程優先級就是OS選擇哪個線程來執行的可能性。優先級越高,線程運行的可能性就越大。但是,優先級并不能向你保證任何事情,在OS切換到其他線程之前。它同樣不能保證一個高優先級的線程總是被選中,相對于低優先級的線程來說。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。