第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在Swift中創(chuàng)建線程安全數(shù)組

在Swift中創(chuàng)建線程安全數(shù)組

我在Swift中遇到了線程問(wèn)題。我有一些對(duì)象的數(shù)組。通過(guò)委托,該類大約每秒鐘獲取一個(gè)新對(duì)象。之后,我必須檢查對(duì)象是否已經(jīng)在數(shù)組中,因此我必須更新對(duì)象,否則必須刪除/添加新對(duì)象。如果添加新對(duì)象,則必須首先通過(guò)網(wǎng)絡(luò)獲取一些數(shù)據(jù)。這是通過(guò)塊進(jìn)行的。現(xiàn)在我的問(wèn)題是,我該如何同步這些任務(wù)?我試過(guò)了dispatch_semaphore,但是這個(gè)阻塞了UI,直到阻塞完成。我還嘗試了一個(gè)簡(jiǎn)單的bool變量,該變量檢查當(dāng)前是否正在執(zhí)行該塊,并同時(shí)跳過(guò)compare方法。但是兩種方法都不理想。管理陣列的最佳方法是什么,我不想在陣列中有重復(fù)的數(shù)據(jù)。
查看完整描述

3 回答

?
POPMUISE

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊

Kirsteins是正確的,但是您并不總是需要使用調(diào)度隊(duì)列。您可以使用:


objc_sync_enter(array)

// manipulate the array

objc_sync_exit(array)

這應(yīng)該可以解決問(wèn)題。為了獲得更多好處,您可以創(chuàng)建一個(gè)需要線程安全時(shí)使用的函數(shù):


func sync(lock: NSObject, closure: () -> Void) {

    objc_sync_enter(lock)

    closure()

    objc_sync_exit(lock)

}


...

var list = NSMutableArray()

sync (list) {

   list.addObject("something")

}

請(qǐng)注意,我已更改AnyObject為NSObject。在Swift集合中,類型被實(shí)現(xiàn)為structs,并通過(guò)value傳遞,因此我猜想使用方便的函數(shù)時(shí),使用通過(guò)引用傳遞的可變集合類會(huì)更安全。sync


Swift更新


線程安全訪問(wèn)的推薦模式是使用dispatch barrier:


let queue = DispatchQueue(label: "thread-safe-obj", attributes: .concurrent)


// write

queue.async(flags: .barrier) {

    // perform writes on data

}


// read

var value: ValueType!

queue.sync {

    // perform read and assign value

}

return value


查看完整回答
反對(duì) 回復(fù) 2019-10-06
?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

我解決此問(wèn)題的方法是使用串行分派隊(duì)列,以同步對(duì)盒裝陣列的訪問(wèn)。當(dāng)您嘗試獲取索引值并且隊(duì)列確實(shí)很忙時(shí),它將阻塞線程,但這也是鎖的問(wèn)題。


public class SynchronizedArray<T> {

    private var array: [T] = []

    private let accessQueue = dispatch_queue_create("SynchronizedArrayAccess", DISPATCH_QUEUE_SERIAL)


    public func append(newElement: T) {

        dispatch_async(self.accessQueue) {

            self.array.append(newElement)

        }

    }


    public subscript(index: Int) -> T {

        set {

            dispatch_async(self.accessQueue) {

                self.array[index] = newValue

            }

        }

        get {

            var element: T!


            dispatch_sync(self.accessQueue) {

                element = self.array[index]

            }


            return element

        }

    }

}


var a = SynchronizedArray<Int>()

a.append(1)

a.append(2)

a.append(3)


// can be empty as this is non-thread safe access

println(a.array)


// thread-safe synchonized access

println(a[0])

println(a[1])

println(a[2])


查看完整回答
反對(duì) 回復(fù) 2019-10-06
?
開(kāi)心每一天1111

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊

Kirsteins的答案是正確的,但是為了方便起見(jiàn),我使用Amol Chaudhari和Rob的建議更新了該答案,他建議使用帶有異步屏障的并發(fā)隊(duì)列來(lái)允許并發(fā)讀取但阻止寫(xiě)入。


我還包裝了一些對(duì)我有用的其他數(shù)組函數(shù)。


public class SynchronizedArray<T> {

private var array: [T] = []

private let accessQueue = dispatch_queue_create("SynchronizedArrayAccess", DISPATCH_QUEUE_CONCURRENT)


public func append(newElement: T) {

    dispatch_barrier_async(self.accessQueue) {

        self.array.append(newElement)

    }

}


public func removeAtIndex(index: Int) {

    dispatch_barrier_async(self.accessQueue) {

        self.array.removeAtIndex(index)

    }

}


public var count: Int {

    var count = 0


    dispatch_sync(self.accessQueue) {

        count = self.array.count

    }


    return count

}


public func first() -> T? {

    var element: T?


    dispatch_sync(self.accessQueue) {

        if !self.array.isEmpty {

            element = self.array[0]

        }

    }


    return element

}


public subscript(index: Int) -> T {

    set {

        dispatch_barrier_async(self.accessQueue) {

            self.array[index] = newValue

        }

    }

    get {

        var element: T!


        dispatch_sync(self.accessQueue) {

            element = self.array[index]

        }


        return element

    }

}

}

UPDATE 這是相同的代碼,為Swift3更新。


public class SynchronizedArray<T> {

private var array: [T] = []

private let accessQueue = DispatchQueue(label: "SynchronizedArrayAccess", attributes: .concurrent)


public func append(newElement: T) {


    self.accessQueue.async(flags:.barrier) {

        self.array.append(newElement)

    }

}


public func removeAtIndex(index: Int) {


    self.accessQueue.async(flags:.barrier) {

        self.array.remove(at: index)

    }

}


public var count: Int {

    var count = 0


    self.accessQueue.sync {

        count = self.array.count

    }


    return count

}


public func first() -> T? {

    var element: T?


    self.accessQueue.sync {

        if !self.array.isEmpty {

            element = self.array[0]

        }

    }


    return element

}


public subscript(index: Int) -> T {

    set {

        self.accessQueue.async(flags:.barrier) {

            self.array[index] = newValue

        }

    }

    get {

        var element: T!

        self.accessQueue.sync {

            element = self.array[index]

        }


        return element

    }

}

}


查看完整回答
反對(duì) 回復(fù) 2019-10-06
  • 3 回答
  • 0 關(guān)注
  • 1027 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)