在Swift 2中,我能够使用以下代码创建队列:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Run Code Online (Sandbox Code Playgroud)
但这不能在Swift 3中编译.
在Swift 3中写这个的首选方法是什么?
许多Cocoa和CocoaTouch方法都有完成回调,实现为Objective-C中的块和Swift中的闭包.但是,在Playground中尝试这些时,永远不会调用完成.例如:
// Playground - noun: a place where people can play
import Cocoa
import XCPlayground
let url = NSURL(string: "http://stackoverflow.com")
let request = NSURLRequest(URL: url)
NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.currentQueue() {
response, maybeData, error in
// This block never gets called?
if let data = maybeData {
let contents = NSString(data:data, encoding:NSUTF8StringEncoding)
println(contents)
} else {
println(error.localizedDescription)
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在我的Playground时间轴中看到控制台输出,但是println我的完成块永远不会被调用...
我正在阅读关于GCD调度队列的文档,并且在其中他们说队列是FIFO,所以我想知道这对异步/同步调度有什么影响?
从我的理解异步执行事情的顺序,它获取的东西,而同步执行串行..
但是当你编写你的GCD代码时,你决定了事情发生的顺序..所以只要你知道你的代码中发生了什么,你应该知道事情执行的顺序.
我的问题是,这里有异步的好处吗?我对这两件事的理解中遗漏了什么.
我知道你可能会发现这是一个奇怪的问题,但我只是在学习GCD,我想完全理解它的所有方面.所以这里是:
是否有任何理由在CURRENT QUEUE上发送任务SYNC?
例如:
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(...);
dispatch_async(concurrentQueue, ^{
//this is work task 0
//first do something here, then suddenly:
dispatch_sync(concurrentQueue, ^{
//work task 1
});
//continue work task 0
});
Run Code Online (Sandbox Code Playgroud)
我理解一件事:如果不是concurrentQueue我使用串行队列,那么我在该串行队列上得到一个死锁,因为work task 1直到work task 0完成才能启动(因为串行队列保证执行顺序),并且在同一时间work task 0不能继续执行,因为它等待SYNC dispath函数返回(请纠正我,如果我错了,这将使我成为一个总菜鸟).
回到最初的想法,上面的代码和相同的代码之间有什么区别,而不是调用dispatch_sync函数我只是work task 1直接编写代码?
我想在后台同步执行一些代码,我真的认为这是可行的方法:
let queue = DispatchQueue.global(qos: .default)
queue.async {
print("\(Thread.isMainThread)")
}
Run Code Online (Sandbox Code Playgroud)
但这会打印,true除非我使用queue.async。async这是不可能的,因为代码将并行执行。如何实现在后台同步运行多个块?
我想要实现的目标是:将应用程序中的事件与设备日历同步,这发生在后台。可以从不同的地方多次调用执行此操作的方法,因此我想保持其顺序和在后台进行。
当我向performBlock我的 MOC 类型发送消息时NSPrivateQueueConcurrencyType,如下所示:
[self.privateManagedObjectContext performBlockAndWait:^{
if ([[NSThread currentThread] isMainThread]) {
NSLog(@"executing on the main thread!!");
}
…
}];
Run Code Online (Sandbox Code Playgroud)
我发现,默认情况下,这在主线程上执行。上述代码中的条件触发,并且问题导航器指示正在执行Thread 1的NSManagedObject Queue.
这让我很困惑,因为 Apple 告诉我们“每个线程必须有自己完全私有的托管对象上下文”。鉴于类型的 MOCNSMainQueueConcurrencyType将使用主线程,它是否违反NSPrivateQueueConcurrencyType了使用主线程类型的 MOC 的线程限制?
我的代码在主线程上执行正常吗?我误解了线程限制吗?我知道队列不一定绑定到特定线程,但在这种情况下,私有 MOC 队列似乎至少应该避免主线程,如果没有单个转到线程。我有一些奇怪的错误,所以我需要弄清楚发生了什么。谢谢!
我有两个函数(或任务),我想一个接一个地运行,我正在使用 DispatchGroup 来跟踪它们并在它们完成时通知我。现在它们正在主线程中完成,但我想在后台线程中运行这些任务。我该怎么做呢?我尝试了几种方法,但它们要么同时运行,要么在第一个方法完成后出现异常错误。以下代码依次执行任务,但如果我在函数内调用 Thread.current,我可以看到它们正在主线程中运行。
@objc func doWorkFunctions(){
taskGroup.enter()
DispatchQueue.global(qos: .background).sync {
self.firstFunction {
self.taskGroup.leave()
}
}
taskGroup.enter()
DispatchQueue.global(qos: .background).sync {
self.secondFunction {
self.taskGroup.leave()
}
}
taskGroup.notify(queue: .main) {
print("All tasks completed")
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用以下代码,它们会同时运行,但在后台线程中运行。
@objc func doWorkFunctions(){
taskGroup.enter()
DispatchQueue.global(qos: .background).async {
self.firstFunction {
self.taskGroup.leave()
}
}
taskGroup.enter()
DispatchQueue.global(qos: .background).async {
self.secondFunction {
self.taskGroup.leave()
}
}
taskGroup.notify(queue: .main) {
print("All tasks completed")
}
}
Run Code Online (Sandbox Code Playgroud)
我一直在寻找又寻找,但似乎找不到我的问题的答案或对此事的澄清。有人可以提供一些关于这里发生的事情的指导吗?这些是案例中所涉及的功能。他们模拟一项长期任务来练习跟踪进度。
func firstFunction(completion: @escaping()->Void){
print(Thread.current)
if childProgressOne.isCancelled { return }
for i in 1...5 {
sleep(1)
childProgressOne.completedUnitCount …Run Code Online (Sandbox Code Playgroud) 我明白dispatch_async()在后台线程上运行一些东西,然后dispatch_main()在主线程上运行它,那么它dispatch_sync()会在哪里进来?
ios ×5
swift ×3
concurrency ×2
asynchronous ×1
callback ×1
closures ×1
core-data ×1
iphone ×1
swift3 ×1
xcode8 ×1