Questions tagged «grand-central-dispatch»

Grand Central Dispatch(GCD)为主要在Apple操作系统(例如iOS,macOS,watchOS和tvOS)以及FreeBSD和MidnightBSD中的并发和异步操作提供了一种简单而强大的机制。



8
NSOperation vs大中央派遣
我正在学习iOS的并发编程。到目前为止,我已经阅读了有关NSOperation/NSOperationQueue和的信息GCD。使用NSOperationQueueover 的原因是什么GCD,反之亦然? 听起来既像GCD又NSOperationQueue抽象NSThreads了用户的显式创建。但是,这两种方法之间的关系对我而言尚不清楚,因此请您提供任何反馈意见!

13
如何在Swift 3、4和5中编写GCD中的dispatch_after?
在Swift 2中,我能够dispatch_after使用大型中央调度来延迟动作: var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) dispatch_after(dispatchTime, dispatch_get_main_queue(), { // your function here }) 但是自Swift 3起,似乎不再编译了。在现代Swift中编写此代码的首选方法是什么?



4
GCD在主线程中执行任务
我有一个可能来自任何线程的回调。当我收到此回调时,我想在主线程上执行某些任务。 我需要检查我是否已经在主线程上吗?或者通过调用下面的代码不执行此检查是否有任何损失? dispatch_async(dispatch_get_main_queue(), ^{ // do work here });

6
在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 } } 或类似这样的东西来延迟执行: dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { print("test") } 或Grand Central …

9
在Swift中如何在GCD主线程上调用带参数的方法?
在我的应用程序中,我有一个函数使NSRURLSession并使用以下命令发送NSURLRequest sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) 在此任务的完成块中,我需要进行一些计算,以将UIImage添加到调用的viewcontroller中。我有一个叫做 func displayQRCode(receiveAddr, withAmountInBTC:amountBTC) 进行UIImage添加计算。如果我尝试在完成块内运行添加视图的代码,则Xcode会引发错误,提示我在后台进程中无法使用布局引擎。所以我在SO上找到了一些代码,试图在主线程上排队一个方法: let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC))) dispatch_after(time, dispatch_get_main_queue(), { let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil) }) 但是,我不知道如何向此函数调用添加参数“ receiveAddr”和“ amountBTC”。我该怎么做,或者有人可以建议将方法调用添加到应用程序主队列的最佳方法?

10
等待直到执行了两个异步块,然后再启动另一个块
使用GCD时,我们要等到两个异步块执行完毕后再继续执行下一步。最好的方法是什么? 我们尝试了以下操作,但似乎不起作用: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block1 }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block2 }); // wait until both the block1 and block2 are done before start block3 // how to do that? dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block3 });

13
我如何等待异步调度的块完成?
我正在测试一些使用Grand Central Dispatch进行异步处理的代码。测试代码如下: [object runSomeLongOperationAndDo:^{ STAssert… }]; 测试必须等待操作完成。我当前的解决方案如下所示: __block BOOL finished = NO; [object runSomeLongOperationAndDo:^{ STAssert… finished = YES; }]; while (!finished); 哪个看起来有些粗糙,您知道更好的方法吗?我可以公开队列,然后通过调用来阻塞dispatch_sync: [object runSomeLongOperationAndDo:^{ STAssert… }]; dispatch_sync(object.queue, ^{}); …但这可能会使曝光量过多object。

8
等待直到带有异步网络请求的swift for loop完成执行
我希望for in循环向Firebase发送一堆网络请求,然后在该方法完成执行后将数据传递给新的视图控制器。这是我的代码: var datesArray = [String: AnyObject]() for key in locationsArray { let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)") ref.observeSingleEventOfType(.Value, withBlock: { snapshot in datesArray["\(key.0)"] = snapshot.value }) } // Segue to new view controller here and pass datesArray once it is complete 我有几个问题。首先,如何等待for循环完成并且所有网络请求完成?我无法修改observeSingleEventOfType函数,它是firebase SDK的一部分。另外,我是否会尝试通过for循环的不同迭代(有意义的希望)访问datesArray来创建某种竞争条件?我一直在阅读有关GCD和NSOperation的文章,但由于这是我开发的第一个应用程序,我有点迷茫。 注意:Locations数组是包含我需要在firebase中访问的键的数组。同样,重要的是异步触发网络请求。我只想等待所有异步请求完成,然后再将datesArray传递给下一个视图控制器。

6
iPhone-大中央调度主线程
我一直在应用程序中成功使用大型中央调度程序,但是我想知道使用这样的东西的真正优势是什么: dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff 甚至 dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff 我的意思是,在两种情况下,您都将触发要在主线程上执行的块,确切地说是应用程序的运行位置,这无助于减少负载。在第一种情况下,您无法控制该块何时运行。我已经看到了在您触发它们后半秒钟执行块的情况。第二种情况,类似于 [self doStuff]; 对? 我想知道你们的想法。

3
串行队列上的dispatch_async和dispatch_sync之间的区别?
我创建了一个这样的串行队列: dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL); 什么之间的差异dispatch_async被称为像这样 dispatch_async(_serialQueue, ^{ /* TASK 1 */ }); dispatch_async(_serialQueue, ^{ /* TASK 2 */ }); 并dispatch_sync在这个串行队列中这样调用? dispatch_sync(_serialQueue, ^{ /* TASK 1 */ }); dispatch_sync(_serialQueue, ^{ /* TASK 2 */ }); 我的理解是,无论使用哪种调度方法,TASK 1都将在执行之前完成并TASK 2正确吗?

6
GCD中的并发与串行队列
我正在努力完全理解GCD中的并发和串行队列。我遇到了一些问题,希望有人能及时明确地回答我。 我正在阅读串行队列的创建和使用,以便依次执行任务。但是,如果发生以下情况,会发生什么情况: 我创建一个串行队列 我使用dispatch_async了3次(在我刚刚创建的串行队列中)分配了三个块A,B,C 将执行以下三个块: 按顺序A,B,C,因为队列是串行的 要么 并发(同时在并行线程上),因为我使用了ASYNC调度 我读到我可以dispatch_sync在并发队列上使用,以便一个接一个地执行块。在那种情况下,为什么甚至不存在串行队列,因为我始终可以使用并发队列,在该队列中可以同步分配任意数量的块? 感谢您的任何解释!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.