iOS
Kedjeblock i en kö (med MKBlockQueue)
Sök…
Introduktion
Med MKBlockQueue kan du skapa en kedja av block och köra dem en efter en i en kö. Jämfört med NSOperation, med MKBlockQueue bestämmer du dig själv när ett block är klart och när du vill att kön ska fortsätta. Du kan också skicka data från ett block till nästa.
Exempelkod
// create the dictionary that will be sent to the blocks
var myDictionary:Dictionary<String, Any> = Dictionary<String, Any>()
myDictionary["InitialKey"] = "InitialValue"
// create block queue
let myBlockQueue:MKBlockQueue = MKBlockQueue()
// block 1
let b1:MKBlockQueueBlockType =
{
(blockQueueObserver:MKBlockQueueObserver, dictionary:inout Dictionary<String, Any>) in
print("Block 1 started with dictionary: \(dictionary)")
dictionary["Block1Key"] = "Block1Value"
// tell this block is now completed
blockQueueObserver.blockCompleted(with:&dictionary)
}
// block 2
let b2:MKBlockQueueBlockType =
{
(blockQueueObserver:MKBlockQueueObserver, dictionary:inout Dictionary<String, Any>) in
var copyOfDictionary:Dictionary<String, Any> = dictionary
// test calling on main thread, async, with delay
DispatchQueue.main.asyncAfter(deadline:(.now() + .seconds(1)), execute:
{
print("Block 2 started with dictionary: \(copyOfDictionary)")
copyOfDictionary["Block2Key"] = "Block2Value"
// tell this block is now completed
blockQueueObserver.blockCompleted(with:©OfDictionary)
})
}
// block 3
let b3:MKBlockQueueBlockType =
{
(blockQueueObserver:MKBlockQueueObserver, dictionary:inout Dictionary<String, Any>) in
var copyOfDictionary:Dictionary<String, Any> = dictionary
// test calling on global background queue, async, with delay
DispatchQueue.global(qos:.background).asyncAfter(deadline:(.now() + .seconds(1)), execute:
{
print("Block 3 started with dictionary: \(copyOfDictionary)")
copyOfDictionary["Block3Key"] = "Block3Value"
// tell this block is now completed
blockQueueObserver.blockCompleted(with:©OfDictionary)
})
}
// add blocks to the queue
myBlockQueue.addBlock(b1)
myBlockQueue.addBlock(b2)
myBlockQueue.addBlock(b3)
// add queue completion block for the queue
myBlockQueue.queueCompletedBlock(
{
(dictionary:Dictionary<String, Any>) in
print("Queue completed with dictionary: \(dictionary)")
})
// run queue
print("Queue starting with dictionary: \(myDictionary)")
myBlockQueue.run(with:&myDictionary)
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow