相关疑难解决方法(0)

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

如何在swift中使用线程?

dispatchOnMainThread:^{

    NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));

}];
Run Code Online (Sandbox Code Playgroud)

multithreading ios swift dispatch-queue

298
推荐指数
12
解决办法
23万
查看次数

如何在Swift 3,Swift 4及更高版本中dispatch_sync,dispatch_async,dispatch_after等?

我在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

230
推荐指数
6
解决办法
18万
查看次数

GCD中的并发vs串行队列

我正在努力完全理解GCD中的并发和串行队列.我有一些问题,希望有人能够清楚地回答我.

  1. 我正在读取串行队列的创建和使用,以便一个接一个地执行任务.但是,如果出现以下情况:

    • 我创建了一个串行队列
    • 我使用dispatch_async(在我刚创建的串行队列上)三次来发送三个块A,B,C

    这三个块会被执行:

    • 按顺序A,B,C,因为队列是串行的

      要么

    • 同时(在parralel线程上同时)因为我使用了ASYNC调度
  2. 我正在阅读我可以dispatch_sync在并发队列上使用,以便一个接一个地执行块.在这种情况下,为什么串行队列甚至存在,因为我总是可以使用并发队列,我可以根据需要同步调度多个块?

    谢谢你的任何好解释!

concurrency multithreading grand-central-dispatch ios

106
推荐指数
5
解决办法
5万
查看次数

在Swift的Dispatch闭包中修改struct实例变量

我正在使用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二进制文件中的某些东西必须已经改变,现在导致我以前工作的代码中断了.我想避免的一种解决方法是使我的结构体成为一个类,这有助于解决问题.如果还有其他方法,请告诉我.

struct grand-central-dispatch swift

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

需要同时发出两个HTTP网络请求(一旦完成就使用完成处理程序)

我有一种情况,我需要发出两个HTTP GET请求,并在两个完成后才处理它们的结果.我在每个单独的网络请求上都有一个完成处理程序但它没有帮助,因为我不知道何时检索来自两个请求的数据.

我对GCD的经验有限但是现在Swift 3已经出局了,我试图找出如何运行多个任务并为它们设置一个完成处理程序.我的研究表明,GCD或NSOperationQueue可能是我正在寻找的解决方案.任何人都可以帮助建议适合工作的工具以及Swift 3中代码的外观吗?

networking http grand-central-dispatch ios swift

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

优先级和背景已在iOS 8中弃用

我有一个使用旧的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)

ios swift ios8 swift3

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

如何在Swift 3中创建具有QoS属性的dispatch_queue?

我在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类创建串行队列?

grand-central-dispatch swift swift3

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

Swift 3中的DISPATCH_QUEUE_T

我正在编写我的第一个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)

有谁知道我是如何解决这个错误的,

托马斯

ios swift swift3

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

在Swift 3.0中从异步线程调用UIAlertController

我有一个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)

asynchronous grand-central-dispatch ios swift swift3

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

在循环中创建swift 3的延迟

我知道我可以使用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 swift3

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

Swift 2到3迁移dispatch_get_global_queue

我有以下代码,我一直试图从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)

dispatch-async swift swift2 swift3 ios10

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