相关疑难解决方法(0)

GCD在主线程中执行任务

我有一个可能来自任何线程的回调.当我得到这个回调,然后我想在主线程上执行某个任务.

我是否需要检查我是否已经在主线程上 - 或者是否因为没有执行此检查而遭受任何惩罚?请调用下面的代码?

dispatch_async(dispatch_get_main_queue(), ^{
   // do work here
});
Run Code Online (Sandbox Code Playgroud)

objective-c grand-central-dispatch

228
推荐指数
3
解决办法
11万
查看次数

Grand Central Dispatch(GCD)与performSelector - 需要更好的解释

我在我的应用程序中使用了GCD和performSelectorOnMainThread:waitUntilDone,并且倾向于认为它们是可互换的 - 也就是说,performSelectorOnMainThread:waitUntilDone是GCD C语法的Obj-C包装器.我一直在考虑这两个命令是等价的:

dispatch_sync(dispatch_get_main_queue(), ^{ [self doit:YES]; });


[self performSelectorOnMainThread:@selector(doit:) withObject:YES waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

我不对吗?也就是说,performSelector*命令与GCD命令有区别吗?我已经阅读了很多关于它们的文档,但还没有看到明确的答案.

iphone multithreading objective-c grand-central-dispatch ios

47
推荐指数
2
解决办法
2万
查看次数

什么需要在主线程?

我写了一个名为ensureInMainThread的小定义(我用了很多).但是,我不确定在主线程上需要调用哪些用户界面方法.怎么样setNeedsDisplaysetNeedsLayout?对于需要在iOS 5.x中的主线程上调用的方法,经验法则是什么?

这些问题是相关的(一些低质量的问题和答案,以及一些非常具体的案例),但我想要一个全面,单一的好答案:

uikit ios

6
推荐指数
1
解决办法
2719
查看次数

是否允许循环方法调用?

我从两个线程调用一个方法,并认为我尝试这个:

- (void)hideEnterButton
{
    if ([NSThread isMainThread])
    {
        enterButton.hidden = YES;
    }
    else
    {
        [self performSelectorOnMainThread:@selector(hideEnterButton) withObject:nil waitUntilDone:NO];
    }
}
Run Code Online (Sandbox Code Playgroud)

原因是我理解所有GUI处理必须在主线程上完成.这会有用吗?

objective-c

4
推荐指数
1
解决办法
178
查看次数