1

考虑一下:

@interface SomeViewController : UIViewController {
    SomeChildObject *child;
}
@end

@implementation SomeViewController

- (void) viewDidLoad {
    ...
    child.delegate = self;
}

- (void) somethingHappened {
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]
        initWithTarget:child
        selector:@selector(doSomething)
        object:nil];
[someNsOperationQueue addOperation:operation];
[operation release];
}

- (void) callbackA:(SomeData *)someData {
[self performSelectorOnMainThread:@selector(callbackAonMainThread:)
                       withObject:someData
                    waitUntilDone:NO];
}

- (void) callbackAonMainThread:(SomeData *)someData {
    ... do something with results in main thread, e.g UI feedback
}

- (void) callbackB:(SomeData *)someData {
[self performSelectorOnMainThread:@selector(callbackBonMainThread:)
                       withObject:someData
                    waitUntilDone:NO];
}

- (void) callbackBonMainThread:(SomeData *)someData {
    ... do something with results in main thread, e.g UI feedback
}


@end

用英语:

我有一个在主线程中运行的视图控制器,它带有一个子模型对象来做某事(通过网络获取数据)。视图控制器是孩子的委托,所以孩子可以用委托发回结果。为了执行昂贵的工作,我使用 NSInvocationOperation 生成 child.doSomething 方法,该方法在后台线程中启动操作。完成后,子进程调用委托(视图控制器)的 callbackA 或 callbackB 并得到一些结果。由于(我认为)这些回调是在运行 doSomething 调用的同一后台线程中调用的,因此我需要调用 performSelectorOnMainThread 将控制权转移回主线程。

这很好用,但我不喜欢每个回调都有两个与回调相关的方法。(实际上有更多的回调,所以真正的代码更加臃肿。)理想情况下,我会做这样的事情:

- (void) callbackA:(SomeData *)someData {
    if (not_running_on_main_thread) {
    [self performSelectorOnMainThread:@selector(callbackA:)
                       withObject:someData
                    waitUntilDone:NO];
    } else {
        // now running on main thread, work with the results.
    }
}

问题:

1)如何进行“not_running_on_main_thread”测试?

2)还有其他方法可以减少回调膨胀吗?

编辑:好的,我在发布之前从未阅读过 NSThread 文档 :) 看起来 [NSThread isMainThread] 是我正在寻找的。但是有没有其他方法可以重组或让它变得更好呢?

4

1 回答 1

6

只需检查[NSThread isMainThread]. 如果你需要多个回调来做不同的事情,你就无能为力了。

我只做不同的一件事,我的代码如下所示:

- (void) callbackA:(SomeData *)someData {
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(callbackA:)
                       withObject:someData
                    waitUntilDone:NO];
        return;
    }

    // now running on main thread, work with the results.
}

这让我摆脱了整个函数else,并使代码更清晰一些。而且您可以通过这种方式节省一个缩进级别;-)

于 2010-01-17T10:34:32.610 回答