这个方法真的很酷:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
但是我需要像它这样简单的东西来在主线程中执行具有多个参数的方法,例如:
- (void)methodWithFirstObject: secondObject:
最简单的方法是什么?
这个方法真的很酷:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
但是我需要像它这样简单的东西来在主线程中执行具有多个参数的方法,例如:
- (void)methodWithFirstObject: secondObject:
最简单的方法是什么?
使用NSDictionary对象作为参数。
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"value1", @"arg1", @"value2", @"arg2", nil];
在 arg 中传递 dict。
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
performSelectorOnMainThread
只是一种方便的玩游戏的方式,NSOperation
这是玩 GDC 的一种方便的方式。如果您需要更多功能,只需下拉到下一个级别。您将不得不管理更多的复杂性,但将具有更大的灵活性。很多可可都是这样设计的。
你会想继续阅读NSOperation
,但我认为这会做你想做的[在我的手机上打字,还没有编译]
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[self myMethod:foo thatRequiresMultiple:bar andAlso:baz];
}];
[[NSOperationQueue mainQueue] addOperation:operation];
dispatch_async()
如果您想waitUntilDone
成为NO
,请致电dispatch_sync()
给YES
:
dispatch_async(dispatch_get_main_queue(), ^{
[reciever methodWithFirstObject:obj1 secondObject:obj2];
});
dispatch_sync()
如果您已经在主线程上,请确保不要使用;dispatch_get_current_queue()
如有必要,您可以测试结果。