由於塊是作爲objective-c對象實現的,因此您可以將其中的一個投射到id
並將其傳遞給performSelector:...
方法。爲了做你想做的事,你可以在NSObject上定義一個接受和調用塊的類別。這是一個例子。它使用NSArray作爲參數,以便可以傳遞不確定數量的參數,並將它們傳遞給數組中的塊。
typedef void (^PerformableBlock)(NSArray *arguments);
@implementation NSObject (PerformBlocks)
- (void)performBlockWithArray:(NSArray *)blockAndArguments {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
PerformableBlock theBlock = (PerformableBlock)[blockAndArguments objectAtIndex:0];
NSArray *blockArgs = [arguments subarrayWithRange:(NSRange){1,[arguments count] - 1}];
theBlock(blockArgs);
[pool release];
}
@end
你可以這樣調用這個使用代碼類似於:
PerformableBlock myBlock = ^(NSArray *args) {
NSLog(@"%@",args);
};
NSArray *array = [NSArray arrayWithObjects:(id)myBlock, arg1, arg2, nil];
[self performSelector:@selector(performBlockWithArray:) onThread:theThread withObject:array waithUntilDone:YES];
正如在評論中提到尼克,它使用本地變量將在棧上創建一個塊。這意味着如果您選擇不等待完成,則需要使用[[myBlock copy] autorelease]
,否則可能會在調用它之前解除分配它。
您是否在具體詢問如何在給定線程上運行塊或僅在非主線程上運行塊? – 2011-04-11 19:52:07
Thanks @Brad Larson。它必須是一個特定的線程,因爲它是我的AsyncSocket的工作原理之一。 – 2011-04-11 20:37:36
@Yar:有沒有你沒有使用GCDAsyncSocket的原因?它是[項目](http://code.google.com/p/cocoaasyncsocket/)本身的一部分,並且使用塊來實現,更不用說對它們提供很好的支持。它還有很多其他非常有用的功能(更大的SSL支持)等,您可能會覺得有用。 – 2011-04-11 22:37:59