我已经创建了一个这样的串行队列:
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,对吗?
我有快速的线程问题.我有一个包含一些对象的数组.在委托上,类每秒都会获得新对象.之后我必须检查对象是否已经在数组中,所以我必须更新对象,否则我必须删除/添加新对象.
如果我添加一个新对象,我必须首先通过网络获取一些数据.这是handelt经过一个街区.
现在我的问题是,如何同步这项任务?
我尝试了一个dispatch_semaphore,但是这个阻止了UI,直到块完成.
我还尝试了一个简单的bool变量,它检查块当前是否执行并同时跳过compare方法.
但这两种方法都不理想.
什么是管理阵列的最佳方式,我不想在阵列中有重复的数据.
我正在编写一个中等复杂的iOS程序,需要为一些较长的操作(解析,连接到网络等)提供多个线程.不过,我很困惑,不同的是什么之间dispatch_get_global_queue和dispatch_queue_create.
我应该使用哪一个,你能给我一个简单的解释,一般来说有什么区别吗?谢谢.
我希望能够原子地增加一个计数器,我找不到任何关于如何做的参考.
根据评论添加更多信息:
我想做这样的事情:
class Counter {
private var mux Mutex
private (set) value Int
func increment (){
mux.lock()
value += 1
mux.unlock()
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在使用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)
或者我会遇到有关线程安全的问题吗?
我正在阅读Apple的文档.我以为我知道何时选择值类型以及何时选择引用类型,但我回到Swif101.文件说:
- 值类型:数据将用于跨多个线程的代码中.
- 引用类型:您希望创建共享的可变状态
多个线程之间是否也共享引用类型?这两条线有什么区别?
swift ×5
ios ×3
arrays ×2
concurrency ×2
struct ×2
class ×1
objective-c ×1
read-write ×1
swift3 ×1
value-type ×1