相关疑难解决方法(0)

Swift变量是原子的吗?

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

我可以安全地并行读取和写入此变量吗?(不考虑这样做的实际意义).

objective-c swift

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

objc_sync_enter/objc_sync_exit无法使用DISPATCH_QUEUE_PRIORITY_LOW

我的应用程序需要一个读/写锁.我读过 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)

multithreading ios swift

27
推荐指数
3
解决办法
9007
查看次数

斯威夫特 - 如何最后拍摄照片库中的3张照片?

我需要在viewDidload事件中获取并显示最后从照片库中拍摄的3张照片而不进行任何点击.

在此步骤之后,当我滚动滚动视图时,我应该获得其他照片3乘3.

你知道用swift做这个的正确方法吗?谢谢.

样品

photolibrary uiscrollview ios swift

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

Swift中的线程安全

我正在开发一个项目来处理状态机更改,这些更改需要在众多线程之间遵守,但只是偶然发现它们在非默认情况下是非原子的.有没有办法在Xcode6-Beta4时使Swift属性成为线程安全的或原子的?提前致谢.

atomic thread-safety ios swift

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

在多个线程中向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

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

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单例模型的重复,因为(如果我理解正确的话)那里他们正在解决访问单例对象本身的问题,但不能确保其属性的读写完成线程安全.

thread-safety swift swift4

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

对数组排序时 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 崩溃

在对数组进行排序时,我遇到间歇性崩溃,并且无法按需重现它,也无法解决该问题。这是崩溃的情况:

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)

arrays sorting xcode ios swift

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

如何在Swift中将元组转换为AnyObject

以下代码编译错误: 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?

tuples swift

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

'OSSpinLock' 在 iOS 10.0 中被弃用:使用 &lt;os/lock.h&gt; 中的 os_unfair_lock() 代替

我经历了这个问题,但提供的解决方案不起作用。有人可以使用 os_unfair_lock() 解释任何替代方法或正确实现吗?

当我使用“OS_UNFAIR_LOCK_INIT”时,它似乎不可用。

在此处输入图片说明

谢谢!

spinlock ios swift

3
推荐指数
2
解决办法
862
查看次数

避免使用ARC的这个悬空指针

我有一个对象,它包含对象的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"

objective-c automatic-ref-counting

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

concurrentPerform在向数组添加值时出现UnsafeMutablePointer.deinitialize错误

我在向数组添加值时发生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)

grand-central-dispatch ios

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