iOS
Chain Blocks in una coda (con MKBlockQueue)
Ricerca…
introduzione
MKBlockQueue ti permette di creare una catena di blocchi ed eseguirli uno dopo l'altro in una coda. Rispetto a NSOperation, con MKBlockQueue ti decidi quando un blocco è completo e quando vuoi che la coda continui. Puoi anche passare i dati da un blocco a quello successivo.
Codice di esempio
// 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow