有没有办法检查当前线程是否是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) 我有一个接受块和完成块的方法.第一个块应该在后台运行,而完成块应该在调用方法的任何队列中运行.
对于后者我总是使用dispatch_get_current_queue(),但似乎它在iOS 6或更高版本中已被弃用.我应该用什么呢?
cocoa-touch objective-c grand-central-dispatch objective-c-blocks ios6
我们在swift 2.2中有这样的函数,用于使用当前运行的线程打印日志消息:
func MyLog(_ message: String) {
if Thread.isMainThread {
print("[MyLog]", message)
} else {
let queuename = String(UTF8String: dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL))! // Error: Cannot convert value of type '()' to expected argument type 'DispatchQueue?'
print("[MyLog] [\(queuename)]", message)
}
}
Run Code Online (Sandbox Code Playgroud)
这些代码不再在swift 3.0中编译.我们现在如何获得队列名称?
问题是如何识别两个线程在同一个线程中的位置:检查Swift 3中是否有正确的调度队列.接受的答案建议用于将setSpecific"标签"与创建的队列相关联.但是,这并不能解决问题,因为我们想知道队列名称.队列可能不一定是由我们自己创建的.
我有一个问题可能不是专门针对实现而是提示/最佳实践的问题.
我正在研究Swift中的一个类,它以JSON格式从在线源获取数据.我希望在这个类中有特定的方法连接到在线源并以Dictionary类型返回结果.功能可能是这样的:
func getListFromOnline()->[String:String]{
var resultList : [String:String]=[:]
...
/*
Some HTTP request is sent to the online source with NSURLRequest
Then I parse the result and assign it to the resultList
*/
...
return resultList
}
Run Code Online (Sandbox Code Playgroud)
我在这个实现中得到的,没有多线程,resultList显然是在从在线源获取之前返回的.毫不奇怪,它会导致程序失败.
任何想法或提示如何实现相反的目标?我在这个实例中对多线程有点困惑,因为我想稍后从另一个类异步调用这个公共方法,我知道如何做到这一点,但是我不知道如何让返回参数的方法在多个内部进行多线程处理本身.
或者根本不是多线程,我在这里没有看到明显的解决方案?