相关疑难解决方法(0)

如何在Swift 3中创建调度队列

在Swift 2中,我能够使用以下代码创建队列:

let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Run Code Online (Sandbox Code Playgroud)

但这不能在Swift 3中编译.

在Swift 3中写这个的首选方法是什么?

grand-central-dispatch ios swift3 xcode8 dispatch-after

393
推荐指数
6
解决办法
32万
查看次数

如何在Playground中运行异步回调

许多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我的完成块永远不会被调用...

closures asynchronous callback swift swift-playground

116
推荐指数
7
解决办法
3万
查看次数

Grand Central Dispatch async vs sync

我正在阅读关于GCD调度队列的文档,并且在其中他们说队列是FIFO,所以我想知道这对异步/同步调度有什么影响?

从我的理解异步执行事情的顺序,它获取的东西,而同步执行串行..

但是当你编写你的GCD代码时,你决定了事情发生的顺序..所以只要你知道你的代码中发生了什么,你应该知道事情执行的顺序.

我的问题是,这里有异步的好处吗?我对这两件事的理解中遗漏了什么.

iphone grand-central-dispatch ios

29
推荐指数
4
解决办法
1万
查看次数

在当前队列上同步调度

我知道你可能会发现这是一个奇怪的问题,但我只是在学习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直接编写代码?

concurrency multithreading grand-central-dispatch ios

7
推荐指数
1
解决办法
1628
查看次数

Swift:在后台同步执行代码;queue.sync无法正常工作

我想在后台同步执行一些代码,我真的认为这是可行的方法:

let queue = DispatchQueue.global(qos: .default)
queue.async {
    print("\(Thread.isMainThread)")
}
Run Code Online (Sandbox Code Playgroud)

但这会打印,true除非我使用queue.asyncasync这是不可能的,因为代码将并行执行。如何实现在后台同步运行多个块?

我想要实现的目标是:将应用程序中的事件与设备日历同步,这发生在后台。可以从不同的地方多次调用执行此操作的方法,因此我想保持其顺序和在后台进行。

multithreading swift

5
推荐指数
1
解决办法
3079
查看次数

为什么 NSManagedObjectContext Queue 在主线程上执行?

当我向performBlock我的 MOC 类型发送消息时NSPrivateQueueConcurrencyType,如下所示:

[self.privateManagedObjectContext performBlockAndWait:^{
    if ([[NSThread currentThread] isMainThread]) {
        NSLog(@"executing on the main thread!!");        
    }
    …
}];
Run Code Online (Sandbox Code Playgroud)

我发现,默认情况下,这在主线程上执行。上述代码中的条件触发,并且问题导航器指示正在执行Thread 1NSManagedObject Queue.

这让我很困惑,因为 Apple 告诉我们“每个线程必须有自己完全私有的托管对象上下文”。鉴于类型的 MOCNSMainQueueConcurrencyType将使用主线程,它是否违反NSPrivateQueueConcurrencyType了使用主线程类型的 MOC 的线程限制?

我的代码在主线程上执行正常吗?我误解了线程限制吗?我知道队列不一定绑定到特定线程,但在这种情况下,私有 MOC 队列似乎至少应该避免主线程,如果没有单个转到线程。我有一些奇怪的错误,所以我需要弄清楚发生了什么。谢谢!

core-data ios

4
推荐指数
1
解决办法
960
查看次数

如何在后台线程中使用 DispatchGroup?

我有两个函数(或任务),我想一个接一个地运行,我正在使用 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)

swift

4
推荐指数
1
解决办法
7896
查看次数

dispatch_sync和dispatch_main有什么区别?

我明白dispatch_async()在后台线程上运行一些东西,然后dispatch_main()在主线程上运行它,那么它dispatch_sync()会在哪里进来?

concurrency multithreading grand-central-dispatch ios

1
推荐指数
1
解决办法
3059
查看次数