การแปลงและรวมสตรีม
ใช้ flatMap, merge, combineLatest และ zip
การแปลงและรวมสตรีม เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
ทำงานกับกระแสข้อมูล
ใน การรวมค่า ตัวเผยแพร่จะส่งกระแสค่าต่าง ๆ ออกมาตามเวลา พลังที่แท้จริงมาจาก ตัวดำเนินการ ซึ่งแปลงและรวมกระแสเหล่านี้ให้เป็นกระแสใหม่
บทเรียนนี้ครอบคลุมตัวดำเนินการสำหรับแปลงและรวมที่สำคัญที่สุด ได้แก่ flatMap, merge, combineLatest และ zip
การแปลงค่าเทียบกับการแปลงแบบแบน
map แปลงค่าแต่ละค่าให้เป็นค่าอื่น ส่วน flatMap ทำได้มากกว่านั้น — แปลงค่าแต่ละค่าให้เป็น ตัวเผยแพร่ใหม่ แล้วทำให้ผลลัพธ์กลายเป็นกระแสเดียว
ใช้ flatMap เมื่ออินพุตแต่ละค่าควรเรียกใช้การดำเนินการแบบไม่พร้อมกันอีกครั้ง
flatMap ในการทำงานจริง
ในตัวอย่างนี้ กระแสของรหัสผู้ใช้จะถูกแปลงเป็นกระแสของคำขอเครือข่าย แล้วทำให้แบนรวมเป็นกระแสเดียวของผู้ใช้
userIdPublisher
.flatMap { id in
apiClient.fetchUser(id: id)
}
.sink { user in
print("Loaded", user.name)
}
.store(in: &cancellables)ควบคุมการทำงานพร้อมกันของ flatMap
โดยค่าเริ่มต้น flatMap จะสมัครรับตัวเผยแพร่ภายในทั้งหมดพร้อมกัน คุณสามารถจำกัดการทำงานพร้อมกันด้วย maxPublishers เพื่อหลีกเลี่ยงการส่งคำขอถล่มเซิร์ฟเวอร์
idsPublisher
.flatMap(maxPublishers: .max(2)) { id in
apiClient.fetchUser(id: id)
}
.sink { print($0) }
.store(in: &cancellables)merge
merge สอดแทรกค่าจากตัวเผยแพร่หลายตัวที่มี ชนิดเดียวกัน ให้เป็นกระแสเดียว โดยส่งแต่ละค่าออกมาทันทีที่มาถึง
let combined = buttonTapA
.merge(with: buttonTapB)
combined
.sink { print("A tap from either button") }
.store(in: &cancellables)combineLatest
combineLatest จะส่งค่าออกมาเมื่อมีตัวเผยแพร่อินพุต ตัวใดก็ตาม ส่งค่า โดยจับคู่กับค่าล่าสุดจากแต่ละตัว เหมาะอย่างยิ่งสำหรับการตรวจสอบแบบฟอร์มที่ต้องพิจารณาหลายช่องพร้อมกัน
usernamePublisher
.combineLatest(passwordPublisher)
.map { name, pass in
!name.isEmpty && pass.count >= 8
}
.sink { isValid in
print("Form valid:", isValid)
}
.store(in: &cancellables)พฤติกรรมของ combineLatest
หมายเหตุ: combineLatest จะไม่ส่งค่าใด ๆ จนกว่าอินพุต ทุกตัว จะส่งค่าออกมาอย่างน้อยหนึ่งค่า หลังจากนั้น การส่งค่าใหม่จากอินพุตใดก็ตามจะทำให้ผลลัพธ์ที่รวมไว้ส่งออกมา โดยใช้ค่าล่าสุดจากอินพุตอื่น
zip
zip จับคู่ค่าตาม ดัชนี: ค่าที่หนึ่งของ A กับค่าที่หนึ่งของ B ค่าที่สองกับค่าที่สอง และต่อไปเรื่อย ๆ โดยจะรอให้ทั้งสองฝั่งมีค่าในแต่ละตำแหน่ง
let names = ["Ann", "Bob", "Cy"].publisher
let ages = [30, 25, 41].publisher
names
.zip(ages)
.sink { name, age in
print(name, "is", age)
}
.store(in: &cancellables)combineLatest เทียบกับ zip
ทั้งสองแบบนี้สับสนกันได้ง่าย:
- combineLatest — ทำงานเมื่อมีการส่งค่าใด ๆ และใช้ค่าล่าสุดของแต่ละตัว
- zip — ทำงานเฉพาะเมื่อมีคู่ค่าที่ตรงกันตามดัชนี
ใช้ combineLatest สำหรับสถานะที่เปลี่ยนแปลงแบบสด และใช้ zip เพื่อจัดผลลัพธ์แบบขนานให้ตรงกันทีละหนึ่งคู่
รวมค่าเพื่อทำงานแบบขนาน
zip มีประโยชน์อย่างมากเมื่อเรียกใช้คำขออิสระหลายรายการแบบขนานและรอให้ทุกคำขอเสร็จสิ้น
fetchProfile
.zip(fetchSettings)
.sink { profile, settings in
print("Both loaded")
}
.store(in: &cancellables)เชื่อมตัวดำเนินการ
กระแสการประมวลผลจริงจะเชื่อมตัวดำเนินการหลายตัวเข้าด้วยกัน เพื่ออธิบายลำดับการทำงานแบบไม่พร้อมกันที่ซับซ้อนในรูปแบบประกาศ
searchTextPublisher
.removeDuplicates()
.flatMap { query in
apiClient.search(query)
}
.map { results in
results.prefix(10)
}
.sink { print($0) }
.store(in: &cancellables)ตรวจสอบความเข้าใจ
ทดสอบความรู้เกี่ยวกับตัวดำเนินการของคุณ
สรุป
คุณได้เรียนรู้การแปลงและรวมกระแสข้อมูล:
- flatMap — แปลงค่าหนึ่งค่าเป็นตัวเผยแพร่แล้วทำให้แบน
- merge — สอดแทรกกระแสที่มีชนิดเดียวกัน
- combineLatest — ใช้ค่าล่าสุดของแต่ละตัวและทำงานเมื่อมีการส่งค่าใด ๆ
- zip — จับคู่ค่าตามดัชนี
ตัวดำเนินการเหล่านี้ช่วยให้คุณประกอบตรรกะแบบไม่พร้อมกันที่ซับซ้อนในรูปแบบประกาศ
คำถามที่พบบ่อย
บทเรียน “การแปลงและรวมสตรีม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแปลงและรวมสตรีม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแปลงและรวมสตรีม”
ใช้ flatMap, merge, combineLatest และ zip คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การแปลงและรวมสตรีม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแปลงและรวมสตรีม
- ตัวจัดตารางเวลาและการทำงานของเธรด
- ตัวดำเนินการจัดการข้อผิดพลาด
- ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง