0Pricing
Swift Academy · บทเรียน

การแปลงและรวมสตรีม

ใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแปลงและรวมสตรีม
  2. ตัวจัดตารางเวลาและการทำงานของเธรด
  3. ตัวดำเนินการจัดการข้อผิดพลาด
  4. ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง
← กลับไปที่ Swift Academy