คุณอาจต้องการทำให้แอป iOS ของคุณเป็นโมดูล แต่ในบางกรณี สิ่งต่างๆ อาจซับซ้อน ในโพสต์นี้ ฉันจะนำเสนอปัญหาที่พบบ่อยที่สุดที่ฉันเจอเมื่อฉันกำลังโมดูลแอป iOS ขนาดใหญ่ที่มีอยู่ และสิ่งที่ฉันทำเพื่อแก้ไขหรือหลีกเลี่ยง ปัญหา

บทความนี้ส่วนใหญ่จะครอบคลุมถึงการพึ่งพา การห่อหุ้ม, แบบวงกลม, รูปภาพ (บันเดิล), pbxproj และ การแยกส่วน ของส่วนแอปที่มีอยู่ในเฟรมเวิร์ก

“เอาล่ะ ฉันจะสร้างสิ่งนี้ได้ที่ไหน”

เมื่อคุณมีเฟรมเวิร์กในแอป คำถามแรกที่อาจเข้ามาในใจคุณคือ “คุณจะเขียนโค้ดสำหรับฟีเจอร์ถัดไปนี้ที่ไหน ?”

ดังที่ผมได้กล่าวไว้ใน โพสต์ก่อนหน้า บนเฟรมเวิร์ก คุณควรจัดหมวดหมู่เฟรมเวิร์กของคุณ คุณสามารถมีเฟรมเวิร์ก หลัก เฟรมเวิร์ก คุณลักษณะ บางอย่าง และเฟรมเวิร์กทางเทคนิค อื่นๆ
หากคุณลักษณะใหม่ของคุณหรืออะไรก็ตาม คุณกำลังจะ พัฒนา จะไม่เข้าสู่กรอบงาน ที่มีอยู่ ใด ๆ คุณอาจต้องการ สร้าง กรอบงาน ใหม่ .

ตัดสินใจเลือก อย่างระมัดระวัง เพราะจะ ผลกระทบ ในภายหลังอย่างแน่นอน หากคุณต้องการ เปลี่ยนแปลง หรือ โต้ตอบ กับคุณลักษณะใหม่นี้ .

“สาธารณะ ภายใน ส่วนตัว ?”

คุณ จะ มีสิ่งนี้โผล่ขึ้นมาตรงหน้าจมูกของคุณ ! เนื่องจากคุณจำเป็นต้องประกาศคลาส/โครงสร้างของคุณหรืออะไรก็ตามที่คุณกำหนดในโมดูลของคุณและต้องการ เข้าถึง จาก ภายนอก เป็น สาธารณะ .

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

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

ดังนั้น หากคุณต้องการปิดเสียงข้อผิดพลาด Xcode เพียงทำเครื่องหมายชั้นเรียนของคุณเป็น สาธารณะ

“มานำเข้าเฟรมเวิร์กนี้ทุกที่ที่เราต้องการ!”

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

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

ดังนั้นจะจัดการ ลิงก์ ระหว่างสองเฟรมเวิร์กที่ ไม่ควร นำเข้าซึ่งกันและกันได้อย่างไร กรณีนี้เป็นคำถามที่น่าสนใจ และ วิธีแก้ปัญหา ประการหนึ่งคือการสร้าง สะพานเชื่อม ระหว่างทั้งสองเฟรมเวิร์ก โดยใช้ รูปแบบ ที่เรียกว่า POP (การเขียนโปรแกรมเชิงโปรโตคอล)

วิธีแก้ปัญหานี้ต้องใช้การอธิบายโพสต์ที่ยาว ดังนั้นฉันจะไม่พูดถึงเรื่องนี้ที่นี่ แต่จะพูดถึงในบทความอื่นอย่างแน่นอน

“แอพของฉันขัดข้องเมื่อโหลดรูปภาพ!”

นี่จะทำให้คุณประสบปัญหาหากคุณแยกส่วนที่มีอยู่ของแอปที่มีรูปภาพจำนวนมาก แต่ละเฟรมเวิร์กมี บันเดิล ของตัวเอง ซึ่งหมายความว่าหากคุณใส่รูปภาพของคุณลงใน framework.xcassets และ โหลด รูปภาพของคุณตามปกติใน .xib หรือ .storyboard หรือแม้กระทั่งการใช้ #imageLiteral ในที่สุดคุณก็จะพบกับ ข้อขัดข้อง ดังด้านล่างนี้ :

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

หากต้องการแก้ไขปัญหานี้ คุณต้องระบุชุดรวมสำหรับรูปภาพทุกอันที่คุณใช้ในกรอบงานนี้ นี่คือตัวอย่างสิ่งที่คุณสามารถทำได้:

ที่นี่คุณกำลังสร้างคลาส ภายใน โมดูล เพียงเพื่อระบุ Bundle init on line 6 ที่คุณต้องการใช้ bundle ของคลาสนั้น ซึ่งก็คือ framework Bundle ด้วยการกำหนดส่วนขยาย Bundle นี้ คุณสามารถสร้างรูปภาพที่อยู่ในกลุ่มเฟรมเวิร์กได้โดย ระบุ ได้อย่างง่ายดาย

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

“ฉันต้องการส่งออกส่วนหนึ่งของแอปของฉัน แต่การขึ้นต่อกันนั้นสูงเกินไป”

เมื่อฉันเริ่มโมดูล ส่วนหนึ่ง ของแอปที่ฉันกำลังทำอยู่ ฉันบังเอิญชนกำแพง ฉันกำลังพยายาม ส่งออก บริการเล็กๆ น้อยๆ ซึ่งจริงๆ แล้วเป็นการ ใช้ บริการอื่น ซึ่ง ขึ้นอยู่กับ บริการอื่น... และอื่นๆ

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

ดังนั้นฉันจึงต้องหาวิธีการส่งออกบริการแรกโดยไม่ต้องหยิบเส้นก๋วยเตี๋ยวทั้งหมด

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

“ขัดแย้งกับ pbxproj… เจ็บคอ!”

ใช่แล้ว ! หากคุณเป็นนักพัฒนาหลายคนที่ทำงานในโครงการ คุณจะต้องเผชิญหน้ากับนรกนี้ น่าเสียดายที่ฉันไม่มีวิธีแก้ปัญหาที่มหัศจรรย์สำหรับปัญหานี้

แต่ละครั้งที่คุณ สร้าง กรอบงานใหม่ หรือ ย้าย ไฟล์ไปยัง เป้าหมาย อื่น หรือโดยทั่วไป ทุกครั้ง ที่คุณแตะที่ การกำหนดค่าของเป้าหมายเดียว คุณกำลังแก้ไขไฟล์ .pbxproj นั่นหมายความว่าคุณจะขัดแย้งกับเพื่อนร่วมทีมของคุณและไฟล์นี้อ่านยากมาก บ่อยครั้งที่คุณจะต้อง “เลือกทั้งสองอย่าง” แต่คุณจะต้องตรวจสอบอย่างแน่นอนว่าโครงการ เสียหาย หรือไม่

อย่างไรก็ตาม มีเครื่องมือชื่อ XcodeGen ที่อาจเป็นวิธีแก้ไขสำหรับปัญหานี้ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ "ที่นี่"

โดยสรุป ฉันไม่มีวิธีแก้ปัญหาที่แท้จริงสำหรับปัญหานี้ แต่โปรดจำไว้ว่าจำนวนข้อขัดแย้งในไฟล์นี้มีความสำคัญเฉพาะที่จุดเริ่มต้น ของการสร้างโครงสร้างกรอบงานของคุณ เมื่อคุณกรอบงาน กำหนดแล้ว ทุกอย่างควรจะดี และคุณจะไม่ต้องฝันร้ายนี้กับคุณอีกต่อไป !

คุณสามารถตรวจสอบ โปรเจ็กต์ GitHub ที่แสดงแอป iOS แบบโมดูลาร์ ปัญหา พื้นฐานที่ฉันพบในโพสต์นี้ และวิธีจัดการ (รูปภาพและ บันเดิล) เป็นต้น)

ฉันหวังว่าโพสต์นี้จะช่วยให้คุณเห็นภาพรวมของปัญหาหลักที่คุณอาจพบเมื่อการปรับโมดูลแอป iOS ปัญหาทั้งหมดนี้สามารถ เอาชนะ ได้ ดังนั้นทำต่อไป ! ;)