如何在swift中使用线程?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
Run Code Online (Sandbox Code Playgroud) 我在Swift 2.x(甚至1.x)项目中有很多代码,如下所示:
// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
dispatch_async(dispatch_get_main_queue()) {
self.imageView.image = image
}
}
Run Code Online (Sandbox Code Playgroud)
或者像这样的东西来延迟执行:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
print("test")
}
Run Code Online (Sandbox Code Playgroud)
或者Grand Central Dispatch API的各种其他用途......
现在我已经在Swift 3的Xcode 8(beta)中打开了我的项目,我得到了各种各样的错误.其中一些提供修复我的代码,但并非所有修复产生工作代码.我该怎么办?
libdispatch grand-central-dispatch dispatch-async swift swift3
我正在努力完全理解GCD中的并发和串行队列.我有一些问题,希望有人能够清楚地回答我.
我正在读取串行队列的创建和使用,以便一个接一个地执行任务.但是,如果出现以下情况:
dispatch_async(在我刚创建的串行队列上)三次来发送三个块A,B,C这三个块会被执行:
按顺序A,B,C,因为队列是串行的
要么
我正在阅读我可以dispatch_sync在并发队列上使用,以便一个接一个地执行块.在这种情况下,为什么串行队列甚至存在,因为我总是可以使用并发队列,我可以根据需要同步调度多个块?
谢谢你的任何好解释!
我正在使用DEVELOPMENT-SNAPSHOT-2016-06-06-aSwift 的版本.我似乎无法绕过这个问题,我已尝试@noescape在各个地方使用,但我仍然有以下错误:
闭包不能隐式捕获变异的自身参数
为了更好地解释,这是一个简单的例子:
public struct ExampleStruct {
let connectQueue = dispatch_queue_create("connectQueue", nil)
var test = 10
mutating func example() {
if let connectQueue = self.connectQueue {
dispatch_sync(connectQueue) {
self.test = 20 // error happens here
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这些Swift二进制文件中的某些东西必须已经改变,现在导致我以前工作的代码中断了.我想避免的一种解决方法是使我的结构体成为一个类,这有助于解决问题.如果还有其他方法,请告诉我.
我有一种情况,我需要发出两个HTTP GET请求,并在两个完成后才处理它们的结果.我在每个单独的网络请求上都有一个完成处理程序但它没有帮助,因为我不知道何时检索来自两个请求的数据.
我对GCD的经验有限但是现在Swift 3已经出局了,我试图找出如何运行多个任务并为它们设置一个完成处理程序.我的研究表明,GCD或NSOperationQueue可能是我正在寻找的解决方案.任何人都可以帮助建议适合工作的工具以及Swift 3中代码的外观吗?
我有一个使用旧的Swift代码开发的应用程序。现在,我将其更新为最新的Swift语法。在进行更新时,我发现调度队列中存在困难,这里给出了两个警告,因为在iOS 8中不推荐使用global(priority),在iOS 8中不推荐使用背景。
DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.background).async(execute: { [weak self] in //Getting warning in this line
if let strongSelf = self {
strongSelf.populateOutBoundContacts()
strongSelf.lookForContactsToPresent()
}
})
Run Code Online (Sandbox Code Playgroud) 我在Swift 2中有这样的代码:
let attrs = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, 0)
let myQueue = dispatch_queue_create("com.example.serial-queue", attrs)
Run Code Online (Sandbox Code Playgroud)
这不能在Swift 3中编译,因为dispatch_queue_attr_make_with_qos_class并且dispatch_queue_create不可用.如何使用自定义QoS类创建串行队列?
我正在编写我的第一个Swift 3,但是我遇到了以下错误
dispatch_queue_t在swift中不可用.
var queue: dispatch_queue_t?
var debugPrint = false
public init() {
let uuid = NSUUID().uuidString
let queueLabel = "tomlogger-queue-" + uuid
queue = dispatch_queue_create(queueLabel, DISPATCH_QUEUE_SERIAL)
}
Run Code Online (Sandbox Code Playgroud)
有谁知道我是如何解决这个错误的,
托马斯
我有一个IBAction调用函数,该函数有时会显示来自异步线程的错误警报。它在模拟器中“有效”,但出现此错误:
CoreAnimation:警告,已删除的线程具有未提交的CATransaction; 在环境中设置CA_DEBUG_TRANSACTIONS = 1以记录回溯。
看到该错误后,我意识到我正在尝试从主线程更新UI,并且需要对其进行修复。
这是我正在调用的异步函数:
let queue = DispatchQueue(label: "com.adrianbindc.myApp.myFunction")
queue.async {
self.createArray()
switch self.arrayIsEmpty() {
case true:
// TODO: update on the main thread
self.displayAlert(alertTitle: "Error Title", alertMessage: "Error Message")
case false:
// Do Stuff Off the Main Queue
DispatchQueue.main.async{
switch someArray.count {
case 0:
// TODO: update on the main thread
self.displayAlert(alertTitle: "Another Error Title", alertMessage: "Another error message.")
default:
// Do other stuff
}
}
}
}
/**
Utility method to display a …Run Code Online (Sandbox Code Playgroud) 我知道我可以使用followign语法(如何编写Swift 3中的延迟)来延迟Swift 3中的部分代码:
let when = DispatchTime.now() + 2 // change 2 to desired second delay.
DispatchQueue.main.after(when: when) {
// run your code with delay
}
Run Code Online (Sandbox Code Playgroud)
或者类似的帖子:如何在Swift 3中创建调度队列
然而,这些不是我可以使用的延迟方法.我需要在循环中插入一个延迟.例如,假设有一个标签组件和一个按钮.当我单击按钮时,我希望标签连续显示循环变量:
@IBOutlet weak var showIntegers: UILabel!
@IBAction func countNums(_ sender: AnyObject) {
for i in 1...5 {
showIntegers.text = String(i)
//delay code here, sleep(1) doesn't work
}
}
Run Code Online (Sandbox Code Playgroud)
我使用睡眠作为延迟但是然后应用程序睡眠5秒然后显示5.我连续1秒钟看不到1,2,3,4和5.
我也弄清楚如何在循环中使用DispatchQueue类.感谢您的帮助.
我有以下代码,我一直试图从swift 2转换为swift 3.这是我到目前为止所拥有的.
DispatchQueue.async(group: DispatchQueue.global(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),execute: {
self.controllerDelegate?.codeToRun(progressWindowViewController: self)
})
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,指出无法使用类型(int,int)的参数列表调用'global'.我知道全局队列需要这个,除非他们在swift 3中改变它吗?在Swift 3中执行全局队列的正确方法是什么?
以前的Swift 2 Equivlent
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),{
self.controllerDelegate?.codeToRun(self)
})
Run Code Online (Sandbox Code Playgroud) swift ×10
swift3 ×7
ios ×6
asynchronous ×1
concurrency ×1
http ×1
ios10 ×1
ios8 ×1
libdispatch ×1
networking ×1
struct ×1
swift2 ×1