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

ลดการประเมิน Body ซ้ำ

ลดการคำนวณมุมมองใหม่ที่ไม่จำเป็น

ลดการประเมิน Body ซ้ำ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

body ถูกคำนวณใหม่บ่อยครั้ง

SwiftUI จะเรียกใช้ body ของมุมมองทุกครั้งที่อินพุตเปลี่ยนแปลง หาก body มีงานมากหรือเชื่อมโยงกับสิ่งต่าง ๆ มากเกินไป ก็จะถูกคำนวณใหม่บ่อยเกินไปและทำให้ประสิทธิภาพลดลง

อะไรทำให้เกิดการประเมินใหม่

body จะทำงานซ้ำเมื่อ @State, @Binding, ออบเจ็กต์ที่สังเกตการณ์ หรือค่าจากสภาพแวดล้อมที่ body อ่านมีการเปลี่ยนแปลง หรือเมื่อมุมมองแม่ส่งค่าใหม่มา

struct Row: View {
    let title: String // changes -> body re-runs
    var body: some View { Text(title) }
}

จำกัดสิ่งที่สังเกต

หากมุมมองอ่าน model ขนาดใหญ่ทั้งชุด การเปลี่ยนแปลงใด ๆ ใน model นั้นจะทำให้ body ทำงานซ้ำ ให้ส่งเฉพาะค่าที่มุมมองต้องการ

// Instead of passing the whole model:
struct Price: View {
    let amount: Decimal // narrow input
    var body: some View { Text(amount, format: .currency(code: "USD")) }
}

แยกมุมมองขนาดใหญ่

แบ่ง body ขนาดใหญ่ออกเป็นมุมมองย่อยขนาดเล็ก SwiftUI จะประเมินใหม่เฉพาะมุมมองย่อยที่อินพุตเปลี่ยนจริง ไม่ใช่ทั้งหน้าจอ

struct Screen: View {
    var body: some View {
        VStack {
            Header()   // re-runs only if its inputs change
            ItemList()
            Footer()
        }
    }
}

Observable และการติดตามระดับฟิลด์

เมื่อใช้มาโคร @Observable SwiftUI จะติดตามคุณสมบัติเฉพาะที่มุมมองอ่านอยู่ มุมมองที่อ่านเพียง model.name จะไม่สนใจการเปลี่ยนแปลงของ model.count

@Observable final class Model {
    var name = ""
    var count = 0
}
// A view reading only name won’t re-run when count changes

หลีกเลี่ยงการทำงานใน body

body ควรอธิบายส่วนติดต่อผู้ใช้ด้วยต้นทุนต่ำ การคำนวณที่ใช้ทรัพยากรมาก เช่น การเรียงลำดับและการกรอง ควรอยู่ใน model หรือคุณสมบัติที่แคชไว้ ไม่ใช่คำนวณใหม่ทุกครั้งที่เรียก body

// Bad: sort inside body (runs every recompute)
// Good: sort once in the model, expose sorted array

คลอเชอร์และอินพุตที่คงที่

การส่งอาร์เรย์หรือคลอเชอร์ที่สร้างขึ้นใหม่ทุกครั้งที่เรนเดอร์ อาจทำให้การตรวจสอบความเท่ากันของ SwiftUI ใช้ไม่ได้ ควรย้ายค่าที่คงที่ออกมา เพื่อให้อินพุตเปรียบเทียบแล้วเท่ากันในการคำนวณใหม่แต่ละครั้ง

// Hoist constants out of body
private let columns = [GridItem(.flexible())]

ระวังตัวเริ่มต้นที่ใช้ทรัพยากรมาก

init ของมุมมองอาจทำงานหลายครั้ง หลีกเลี่ยงการทำงานหนักในนั้น เพราะ SwiftUI สร้างค่ามุมมองบ่อยครั้งแม้จะไม่ได้นำไปเรนเดอร์

struct Card: View {
    init(_ item: Item) { /* keep this trivial */ }
    var body: some View { Text("Card") }
}

การอ่านค่าสภาพแวดล้อมทำให้เกิดการอัปเดต

การอ่านค่าจากสภาพแวดล้อมจะทำให้มุมมองสมัครรับการเปลี่ยนแปลงของค่านั้น ควรอ่านค่าจากสภาพแวดล้อมเฉพาะจุดที่จำเป็นและในมุมมองย่อยที่เล็กที่สุด เพื่อจำกัดขอบเขตการประเมินใหม่

@Environment(\.colorScheme) private var scheme

คอนเทนเนอร์แบบขี้เกียจ

ใช้ LazyVStack/LazyHStack และ List เพื่อไม่สร้างแถวที่อยู่นอกหน้าจอจนกว่าจะจำเป็น ช่วยลดจำนวนครั้งที่ body ทำงานสำหรับคอลเลกชันขนาดใหญ่

ScrollView {
    LazyVStack {
        ForEach(items) { RowView(item: $0) }
    }
}

วัดผลก่อน แล้วจึงเพิ่มประสิทธิภาพ

อย่าคาดเดาว่า body ใดใช้เวลามาก ใช้เครื่องมือวัดประสิทธิภาพของ SwiftUI เพื่อค้นหามุมมองที่มีจำนวนครั้งในการประเมิน body สูง แล้วจึงใช้เทคนิคเหล่านี้กับมุมมองนั้น

ตรวจสอบสั้น ๆ: การประเมินใหม่

ทดสอบความเข้าใจเกี่ยวกับการประเมิน body ใหม่

ทบทวน: การลดการประเมิน body ใหม่

body จะทำงานซ้ำเมื่ออินพุตเปลี่ยนแปลง ดังนั้นให้ส่งค่าในขอบเขตแคบ แบ่งมุมมองขนาดใหญ่ออกเป็นมุมมองย่อยขนาดเล็ก และใช้การติดตามระดับฟิลด์ของ @Observable ให้ body และตัวเริ่มต้นมีต้นทุนต่ำ ย้ายอินพุตที่คงที่ออกมา อ่านค่าจากสภาพแวดล้อมเท่าที่จำเป็น และใช้คอนเทนเนอร์แบบขี้เกียจกับคอลเลกชันขนาดใหญ่

ตรวจสอบจุดที่ใช้เวลามากด้วยเครื่องมือวัดประสิทธิภาพของ SwiftUI เสมอก่อนเพิ่มประสิทธิภาพ

คำถามที่พบบ่อย

บทเรียน “ลดการประเมิน Body ซ้ำ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ลดการประเมิน Body ซ้ำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ลดการประเมิน Body ซ้ำ”

ลดการคำนวณมุมมองใหม่ที่ไม่จำเป็น คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ลดการประเมิน Body ซ้ำ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ทำความเข้าใจเอกลักษณ์ของมุมมอง
  2. ลดการประเมิน Body ซ้ำ
  3. มุมมองแบบ Equatable และขอบเขต @State
  4. การวิเคราะห์ประสิทธิภาพด้วยเครื่องมือ SwiftUI
← กลับไปที่ Swift Academy