我有一个可能来自任何线程的回调.当我得到这个回调,然后我想在主线程上执行某个任务.
我是否需要检查我是否已经在主线程上 - 或者是否因为没有执行此检查而遭受任何惩罚?请调用下面的代码?
dispatch_async(dispatch_get_main_queue(), ^{
// do work here
});
Run Code Online (Sandbox Code Playgroud) 有没有办法检查当前线程是否是Objective-C中的主线程?
我想做这样的事情.
- (void)someMethod
{
if (IS_THIS_MAIN_THREAD?) {
NSLog(@"ok. this is main thread.");
} else {
NSLog(@"don't call this method from other thread!");
}
}
Run Code Online (Sandbox Code Playgroud) 我在使用内置的Xcode单元测试框架SenTestingKit测试一些宏的中央调度代码时遇到了一些麻烦.我成功地解决了我的问题.我有一个单元测试,它构建一个块并尝试在主线程上执行它.但是,该块永远不会被实际执行,因此测试会挂起,因为它是同步调度.
- (void)testSample {
dispatch_sync(dispatch_get_main_queue(), ^(void) {
NSLog(@"on main thread!");
});
STFail(@"FAIL!");
}
Run Code Online (Sandbox Code Playgroud)
什么是导致它挂起的测试环境?
我的应用程序从服务器,数据和数据描述符下载了几个资源.由用户操作触发的这些下载可以同时执行,例如,一次最多50次下载.所有这些异步任务最终都会在内存中创建对象(例如,将叶子附加到数据结构,例如向可变字典或对象添加键到数组).我的问题是:这会导致稳定性问题吗?例如,如果几个同时的任务尝试将键添加到同一个字典中,我是否应该处理这种情况,放置某种锁?如果我实现了一个在数组中查找图形元素的for循环,那么其他正在运行的任务是否可能在循环期间更改数组内容?关于除官方文档之外的多任务,多线程问题的任何参考或主要,一般方向?
这是我的代码:
-(void) recordButton{
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
NSLog(@"value of the grant is :: %hhd", granted);
if (granted)
{
// perform operation recording
// perfrom some operation on UI(changing labels and all)
}
else
{
// do operation
}
}];
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我第一次运行我的应用程序时,在隐私中重置并且我的应用程序调用上面定义的方法后,会产生麻烦.
当我的应用程序第一次运行时,弹出允许/禁止麦克风乱码(操作系统定义)方法.当我点击允许它显示布尔值(授予correclty).正确进入IF内部.正确开始录制.但UI冻结了.并且IF的第二部分即改变标签名称,直到执行时才会执行计时器(由我添加停止方法和记录).
请帮忙.我可以感觉到我的第二部分IF(更改UI标签不在前台工作),即后台工作正常运行.请帮助,我不是专家.2个月前启动了iOS编程.