多線程之NSInvocationOperation
多線程編程是防止主線程堵塞,增加運行效率等等的最佳方法。而原始的多線程方法存在很多的毛病,包括線程鎖死等。在Cocoa中,Apple提供了NSOperation這個類,提供了一個優秀的多線程編程方法。
本次介紹NSOperation的子集,簡易方法的NSInvocationOperation:
@implementation MyCustomClass - (void)launchTaskWithData:(id)data{ //建立一個NSInvocationOperation對象,並初始化到方法 //在這裡,selector參數後的值是你想在另外一個線程中啟動並執行方法(函數,Method) //在這裡,object後的值是想傳遞給前面方法的資料 NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod:) object:data]; // 下面將我們建立的操作“Operation”加入到本地程式的共用隊列中(加入後方法就會立刻被執行) // 更多的時候是由我們自己建立“操作”隊列 [[MyAppDelegate sharedOperationQueue] addOperation:theOp];} // 這個是真正運行在另外一個線程的“方法”- (void)myTaskMethod:(id)data{ // Perform the task.} @end
一個NSOperationQueue 操作隊列,就相當於一個線程管理器,而非一個線程。因為你可以設定這個線程管理器內可以並行啟動並執行的線程數量等等。下面是建立並初始化一個操作隊列:
@interface MyViewController : UIViewController { NSOperationQueue *operationQueue; //在標頭檔中聲明該隊列}@end @implementation MyViewController - (id)init{ self = [super init]; if (self) { operationQueue = [[NSOperationQueue alloc] init]; //初始化操作隊列 [operationQueue setMaxConcurrentOperationCount:1]; //在這裡限定了該隊列只同時運行一個線程 //這個隊列已經可以使用了 } return self;} - (void)dealloc{ [operationQueue release]; //正如Alan經常說的,我們是程式的好公民,需要釋放記憶體! [super dealloc];} @end
簡單介紹之後,其實可以發現這種方法是非常簡單的。很多的時候我們使用多線程僅僅是為了防止主線程堵塞,而NSInvocationOperation就是最簡單的多線程編程,在iPhone編程中是經常被用到的。