我的代码需要保证在主线程上运行某个操作,但调用可能来自后台线程.
为了检测后台的情况,我使用了以下内容:
- (void)selectorToRunInMainThread:(id)arguments
{
// push to main thread
if ([NSRunLoop currentRunLoop] != [NSRunLoop mainRunLoop])
{
[self performSelectorOnMainThread:@selector(selectorToRunInMainThread:) withObject:arguments waitUntilDone:NO];
return;
}
/*
... function content ...
*/
}
Run Code Online (Sandbox Code Playgroud)
这适用于iOS 4和iOS 3.2,但不适用于iOS 3.1.3及更早版本.在这些早期版本中,该函数将继续在无限循环中调用.
将比较更改为:
if (![[NSRunLoop currentRunLoop] isEqualTo:[NSRunLoop mainRunLoop]])
没有效果,他们仍然永远不会比较相同的价值.
我找到了一个似乎有效的解决方案,但我想先看看其他人的建议.
我有一个方法应该支持从任何队列调用,并应该期望.它在后台线程本身运行一些代码,然后在它返回一个值的块参数时使用dispatch_get_main_queue.我不希望它强制它进入主队列,如果不是它进入方法时.有没有办法获得指向当前调度队列的指针?
之前已经回答过Android,Objective C和C++,但显然不适用于Python.如何可靠地确定当前线程是否是主线程?我可以想到一些方法,其中没有一个真正让我满意,认为它可以像比较它是否容易threading.MainThread.
主线程实例化threading.py如下:
Thread.__init__(self, name="MainThread")
Run Code Online (Sandbox Code Playgroud)
所以可以做到
if threading.current_thread().name == 'MainThread'
Run Code Online (Sandbox Code Playgroud)
但是这个名字是固定的吗?我看过的其他代码检查了是否MainThread包含在线程名称的任何位置.
我可以在程序启动的那一刻存储对起始线程的引用,即当时还没有其他线程.这绝对可靠,但对于这样一个简单的查询来说太麻烦了?
这样做有更简洁的方法吗?
在Xamarin/MonoTouch中是否有办法检测是否在主线程中调用了代码?
我正在寻找类似于Java的东西EventQueue.isEventDispatchThread()- 我在Swing编程中发现它assert不时(或有时候assert不是这样)很方便 - 确保模型不断更新并从EDT中读取,长时间运行的调用不会阻止UI.
我想在我的MonoTouch应用程序中做同样的事情,以确保不会从UI调用或包含各种代码InvokeOnMainThread.
更新:对于后来出现的人:来自JP的Obj-C回答如下.Xamarin/MonoTouch相当于NSThread.Current.IsMainThread.