相关疑难解决方法(0)

串行队列上dispatch_async和dispatch_sync之间的区别?

我已经创建了一个这样的串行队列:

    dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL);
Run Code Online (Sandbox Code Playgroud)

dispatch_async叫做这样的有什么区别

 dispatch_async(_serialQueue, ^{ /* TASK 1 */ });
 dispatch_async(_serialQueue, ^{ /* TASK 2 */ });
Run Code Online (Sandbox Code Playgroud)

dispatch_sync像这样调用这个串行队列?

 dispatch_sync(_serialQueue, ^{ /* TASK 1 */ });
 dispatch_sync(_serialQueue, ^{ /* TASK 2 */ });
Run Code Online (Sandbox Code Playgroud)

我的理解是,无论使用哪种调度方法,TASK 1都会在执行和完成之前TASK 2,对吗?

multithreading grand-central-dispatch ios

120
推荐指数
3
解决办法
4万
查看次数

在swift中创建线程安全数组

我有快速的线程问题.我有一个包含一些对象的数组.在委托上,类每秒都会获得新对象.之后我必须检查对象是否已经在数组中,所以我必须更新对象,否则我必须删除/添加新对象.

如果我添加一个新对象,我必须首先通过网络获取一些数据.这是handelt经过一个街区.

现在我的问题是,如何同步这项任务?

我尝试了一个dispatch_semaphore,但是这个阻止了UI,直到块完成.

我还尝试了一个简单的bool变量,它检查块当前是否执行并同时跳过compare方法.

但这两种方法都不理想.

什么是管理阵列的最佳方式,我不想在阵列中有重复的数据.

arrays multithreading read-write ios swift

51
推荐指数
8
解决办法
4万
查看次数

dispatch_get_global_queue和dispatch_queue_create有什么区别?

我正在编写一个中等复杂的iOS程序,需要为一些较长的操作(解析,连接到网络等)提供多个线程.不过,我很困惑,不同的是什么之间dispatch_get_global_queuedispatch_queue_create.

我应该使用哪一个,你能给我一个简单的解释,一般来说有什么区别吗?谢谢.

multithreading objective-c grand-central-dispatch ios

42
推荐指数
2
解决办法
2万
查看次数

如何在Swift中以原子方式递增变量?

我希望能够原子地增加一个计数器,我找不到任何关于如何做的参考.

根据评论添加更多信息:

  • 你在用GCD吗?不,我没有使用GDC.必须使用队列系统来增加数字似乎有点过分.
  • 您理解基本的线程安全?是的,否则我不会询问原子增量.
  • 这个变量是本地的吗?没有.
  • 它是实例级吗?是的,它应该是单个实例的一部分.

我想做这样的事情:

 class Counter {
      private var mux Mutex
      private (set) value Int
      func increment (){
          mux.lock()
          value += 1
          mux.unlock()
      }
 }
Run Code Online (Sandbox Code Playgroud)

concurrency swift

41
推荐指数
4
解决办法
2万
查看次数

如果数组是值类型并因此被复制,那么它们如何不是线程安全的?

阅读本文我了解到:

不共享值类型的实例:每个线程都有自己的副本.*这意味着每个线程都可以读取和写入其实例,而不必担心其他线程在做什么.

然后我被带到这个答案及其评论

并被告知:

一个数组本身不是线程安全的,正在从多个线程访问,因此必须同步所有交互.

关于每个线程都有自己的副本,我被告知

如果一个线程正在更新一个数组(可能是因为你可以看到来自另一个队列的编辑),那根本就不适用

根本不适用 < - 为什么不呢?

我最初认为所有这一切都发生了,因为数组即一个值类型被包装成一个类但令我惊讶的是我被告知不是真的!所以我又回到了Swift 101:D

arrays multithreading struct value-type swift

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

DispatchSemaphore是NSLock的一个很好的替代品吗?

我一直在使用NSLocks来同步敏感的代码部分,但由于它们必须从锁定它们的同一个线程中解锁而一直遇到问题.然后我发现GCD DispatchSemaphore似乎做了同样的事情,增加了方便性,可以从任何线程发出信号.不过,我想知道,如果这种便利是以线程安全为代价的.更换是否可取

let lock = NSLock()
lock.lock()
// do things...
lock.unlock()
Run Code Online (Sandbox Code Playgroud)

let semaphore = DispatchSemaphore(value: 1)
semaphore.wait()
// do things...
semaphore.signal()
Run Code Online (Sandbox Code Playgroud)

或者我会遇到有关线程安全的问题吗?

concurrency swift swift3

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

Apple对具有多个线程的引用和值类型的描述

我正在阅读Apple的文档.我以为我知道何时选择值类型以及何时选择引用类型,但我回到Swif101.文件说:

  • 值类型:数据将用于跨多个线程的代码中.
  • 引用类型:您希望创建共享的可变状态

多个线程之间是否也共享引用类型?这两条线有什么区别?

multithreading struct class swift

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