首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >performSelector: onThread:?

performSelector: onThread:?
EN

Stack Overflow用户
提问于 2011-04-11 17:59:37
回答 2查看 2.7K关注 0票数 2

虽然我也不难想出我自己的方法,但效率不如

代码语言:javascript
复制
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

有一个内置的方法来用块来完成这个任务吗?

如果没有,是否可以避免创建对象、将块放在对象上并将其传递给选择器方法?我还想知道在块中访问数据是否会有问题.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-11 21:45:55

performSelector:方法等价的块是CFRunLoopPerformBlock --您只需要获得对该线程的CFRunLoop的引用。

请查看函数的苹果的文档,并注意讨论中的警告--您可能希望在之后调用CFRunLoopWakeUp,以便立即执行该块。

票数 5
EN

Stack Overflow用户

发布于 2011-04-11 21:14:14

由于块是作为objects对象实现的,所以可以将一个对象转换为id,并将其传递给performSelector:...方法。为了做您想做的事情,您可以在NSObject上定义一个类别,它接受并调用这个块。下面是一个例子。它使用NSArray作为参数,这样就可以传递不确定数量的参数,并将它们传递给数组中的块。

代码语言:javascript
复制
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

然后,您将使用类似于以下代码的代码对此进行调用:

代码语言:javascript
复制
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];

正如Nick在注释中提到的,将在堆栈上创建一个使用局部变量的块。这意味着在将它添加到数组时需要使用[[myBlock copy] autorelease],如果您选择不等待它完成,或者在调用它之前可以将它解除分配。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5625427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档