Section 8/161 menit
8. Operator Pengumpulan dan Buffering
8. Operator Pengumpulan dan Buffering
chunks(ofCount:)
Mengumpulkan tepat N elemen sebelum emit sebagai koleksi. Chunk terakhir mungkin berisi lebih sedikit elemen jika sequence selesai sebelum penuh.
swift
// chunks: proses dalam batch N elemen
let records = databaseStream() // AsyncSequence<Record>
for await batch in records.chunks(ofCount: 100) {
// batch: ArraySlice<Record> dengan maksimum 100 elemen
try await bulkInsert(Array(batch))
print("Inserted \(batch.count) records")
}
AsyncChannel sebagai Buffer
AsyncChannel dari package ini menyediakan back-pressure aware channel — cocok untuk producer-consumer dengan kecepatan berbeda.
swift
// AsyncChannel: channel dengan back-pressure
let channel = AsyncChannel<Data>()
// Producer task
Task {
for url in urlList {
let data = try await download(url)
await channel.send(data) // menunggu jika consumer sibuk
}
channel.finish()
}
// Consumer task
Task {
for await data in channel {
try await process(data) // consumer mengontrol kecepatan
}
}
AsyncThrowingChannel
Seperti AsyncChannel tapi bisa mengirim error untuk mengakhiri sequence.
swift
// AsyncThrowingChannel: channel yang bisa throw error
let channel = AsyncThrowingChannel<URLSessionDataTask, Error>()
Task {
do {
for request in pendingRequests {
let task = try await executeRequest(request)
await channel.send(task)
}
channel.finish()
} catch {
channel.fail(error) // tutup channel dengan error
}
}
// Consumer
Task {
do {
for try await task in channel {
await handleTask(task)
}
} catch {
print("Channel error: \(error)")
}
}