在Objective-C中,您可以区分原子和非原子属性:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
Run Code Online (Sandbox Code Playgroud)
根据我的理解,您可以安全地读取和写入从多个线程定义为原子的属性,而同时从多个线程编写和访问非原子属性或ivars可能导致未定义的行为,包括错误的访问错误.
所以如果你在Swift中有这样的变量:
var object: NSObject
Run Code Online (Sandbox Code Playgroud)
我可以安全地并行读取和写入此变量吗?(不考虑这样做的实际意义).
我的应用程序需要一个读/写锁.我读过 https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
并编写了我自己的类,因为swift中没有读/写锁
class ReadWriteLock {
var logging = true
var b = 0
let r = "vdsbsdbs" // string1 for locking
let g = "VSDBVSDBSDBNSDN" // string2 for locking
func waitAndStartWriting() {
log("wait Writing")
objc_sync_enter(g)
log("enter writing")
}
func finishWriting() {
objc_sync_exit(g)
log("exit writing")
}
// ???? ???? ??? ?????? ?????????? ????? ?????? ??????
// ? ????????? ??????
func waitAndStartReading() {
log("wait reading")
objc_sync_enter(r)
log("enter reading")
b++
if b == 1 {
objc_sync_enter(g)
log("read lock writing")
}
print("b = …Run Code Online (Sandbox Code Playgroud) 我需要在viewDidload事件中获取并显示最后从照片库中拍摄的3张照片而不进行任何点击.
在此步骤之后,当我滚动滚动视图时,我应该获得其他照片3乘3.
你知道用swift做这个的正确方法吗?谢谢.

我正在开发一个项目来处理状态机更改,这些更改需要在众多线程之间遵守,但只是偶然发现它们在非默认情况下是非原子的.有没有办法在Xcode6-Beta4时使Swift属性成为线程安全的或原子的?提前致谢.
我想将给定的块添加到数组中,然后在请求时运行数组中包含的所有块.我有类似这样的代码:
class MyArrayBlockClass {
private var blocksArray: Array<() -> Void> = Array()
private let blocksQueue: NSOperationQueue()
func addBlockToArray(block: () -> Void) {
self.blocksArray.append(block)
}
func runBlocksInArray() {
for block in self.blocksArray {
let operation = NSBlockOperation(block: block)
self.blocksQueue.addOperation(operation)
}
self.blocksQueue.removeAll(keepCapacity: false)
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于可以跨多个线程调用addBlockToArray.发生的事情是addBlockToArray在不同的线程中快速连续调用,并且只附加其中一个项目,因此在runBlocksInArray期间不会调用另一个项目.
我尝试过这样的东西,但似乎不起作用:
private let blocksDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
func addBlockToArray(block: () -> Void) {
dispatch_async(blocksDispatchQueue) {
self.blocksArray.append(block)
}
}
Run Code Online (Sandbox Code Playgroud) arrays multithreading read-write grand-central-dispatch swift
我有和应用程序有一个单一的存储整个应用程序的信息.但是,当使用来自不同线程的单例时,这会产生一些数据争用问题.
这里有一个非常虚拟和简单化的问题版本:
独生子
class Singleton {
static var shared = Singleton()
var foo: String = "foo"
}
Run Code Online (Sandbox Code Playgroud)
单例的使用(为简单起见,来自AppDelegate)
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
DispatchQueue.global().async {
var foo = Singleton.shared.foo // Causes data race
}
DispatchQueue.global().async {
Singleton.shared.foo = "bar" // Causes data race
}
return true
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法确保单例是线程安全的,所以它可以在应用程序的任何地方使用,而不必担心你在哪个线程?
这个问题不是在Swift中使用dispatch_once单例模型的重复,因为(如果我理解正确的话)那里他们正在解决访问单例对象本身的问题,但不能确保其属性的读写完成线程安全.
在对数组进行排序时,我遇到间歇性崩溃,并且无法按需重现它,也无法解决该问题。这是崩溃的情况:
Crashed: com.apple.root.background-qos XC_BAD_ACCESS KERN_INVALID_ADDRESS 0x003400010efebbe8
specialized Array._createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:) + 4341522208
请参阅下面我认为导致崩溃的代码(我认为这是一个线程问题),我相信它正在发生。任何有关此事的帮助将不胜感激!我已经为这个问题苦苦挣扎了好几天了。如果您需要任何进一步的信息,请告诉我。提前致谢:
func getPopCultureNews(completion: @escaping () -> Void) {
let group = DispatchGroup()
var items = [NewsItem]()
for feed in NewsManager.shared.popCultureFeedUrls {
group.enter()
if let feedURL = URL(string: feed) {
let parser = FeedParser(URL: feedURL)
parser.parseAsync(queue: .global(qos: .background)) { (result) in
switch result {
case .success(let feed):
switch feed {
case let .atom(feed):
if let entries = feed.entries {
entries.forEach { (entry) in
let item = NewsItem(atomEntry: entry, rssEntry: nil, jsonEntry: …Run Code Online (Sandbox Code Playgroud) 以下代码编译错误: Error:(112, 20) type '(String, Int)' does not conform to protocol 'AnyObject'
func myMethode() {
aMethodeThatICanNotChange {
let a = ("John",7)
return a // Error:(112, 20) type '(String, Int)' does not conform to protocol 'AnyObject'
}
}
func aMethodeThatICanNotChange(closure: () -> AnyObject) {
// do something with closure
}
Run Code Online (Sandbox Code Playgroud)
如何将元组转换/转换为AnyObject?
我经历了这个问题,但提供的解决方案不起作用。有人可以使用 os_unfair_lock() 解释任何替代方法或正确实现吗?
当我使用“OS_UNFAIR_LOCK_INIT”时,它似乎不可用。
谢谢!
我有一个对象,它包含对象的strong引用:
@property (nonatomic, strong) NSObject *thing;
Run Code Online (Sandbox Code Playgroud)
在其他地方,我有一个传递对象引用的方法:
[thirdObject doSomething:secondObject.thing];
Run Code Online (Sandbox Code Playgroud)
在一个案例中(百万或十亿),第三个对象最终使用悬空指针,因为对象被交换并且没有所有者.
这样做可以避免这种情况吗?这与ARC不同吗?
NSObject *thing = secondObject.thing
[thirdObject doSomething:secondObject.thing];
Run Code Online (Sandbox Code Playgroud)
如果没有,我该如何避免这种情况?
编辑:消息是"消息发送到解除分配的实例0xwhatever"
我在向数组添加值时发生concurrentPerform错误.我按下按钮.在出错的那一刻,myArray01有133个.在其他运行中,myArray01有69个元素.如何删除此错误?
出错线
线程8:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)
在控制台
致命错误:UnsafeMutablePointer.deinitialize with negative count 2017-12-24 11:59:53.438933 + 0300 ap02 [7624:1873749]致命错误:UnsafeMutablePointer.deinitialize with negative count(lldb)
类似主题Swift:UnsafeMutablePointer.deinitialize在附加到数组 Swift时带有负数的致命错误:UnsafeMutablePointer.deinitialize在附加到数组时带有负数的致命错误
var myArray01 = [4444,5555]
@IBAction func button01Pressed(_ sender: Any) {
self.doIt01()
}
func doIt01() {
DispatchQueue.concurrentPerform(iterations: 1000) { iter in
var max = 100000
for iterB in 0..<100000 {
var k = 0
k = k + 1
var half:Int = max/2
if (iterB == half) {
myArray01.append(iter)
}
}
}
}
Run Code Online (Sandbox Code Playgroud) swift ×9
ios ×6
arrays ×2
objective-c ×2
atomic ×1
photolibrary ×1
read-write ×1
sorting ×1
spinlock ×1
swift4 ×1
tuples ×1
uiscrollview ×1
xcode ×1