روش های برقراری ارتباط بین کلاس ها در سوئیفت ۵ – به زبان ساده

۱۰۰
۱۴۰۲/۰۶/۲۹
۴ دقیقه
PDF
آموزش متنی جامع
امکان دانلود نسخه PDF

زمانی که یک اپلیکیشن iOS ایجاد می‌کنید، در اغلب موارد نیاز است که بین کلاس‌های Model ،View و Controller ارتباط‌هایی برقرار کنید. در این مقاله به بررسی روش‌های مختلف برای برقراری ارتباط بین کلاس ها در سوئیفت 5 می‌پردازیم. تصویر زیر الگوی معماری MVC را نمایش می‌دهد که روشی برای طراحی کردن یک گردش داده در پروژه‌ها محسوب می‌شود.

روش های برقراری ارتباط بین کلاس ها در سوئیفت ۵ – به زبان سادهروش های برقراری ارتباط بین کلاس ها در سوئیفت ۵ – به زبان ساده
997696
برقرای ارتباط بین کلاس ها در سوئیفت

یکی از مزایای استفاده از یک الگوی معماری این است که کد شما به سادگی درک خواهد شد، ماژولار می‌شود و قابلیت نگهداری آن ارتقا می‌یابد. با تجزیه کلاس‌ها به دسته‌های مختلف نیازمند یک روش مؤثر برای برقراری ارتباط در مسیر model -> controller -> view و برعکس خواهیم بود. ما در ادامه 3 روشی که برای نیل به این مقصود مورد نیاز است را مورد بررسی قرار داده‌ایم. این سه روش به صورت خلاصه شامل موارد زیر هستند:

  • استفاده از نوتیفیکیشن
  • استفاده از نمایندگی
  • استفاده از callback

با ما همراه باشید تا با بررسی این موارد درکی مقدماتی از مزایا و معایب هر روش پیدا کنید و بتوانید راه‌حل مناسب خود را انتخاب نمایید.

نوتیفیکیشن

استفاده از نوتیفیکیشن زمانی مناسب خواهد بود که مشاهده‌گرهای زیادی داشته باشیم که برای به‌روزرسانی نیازمند «شنیدن» باشند. برای نمونه اگر 5 کلاس دارید که همگی داده‌های ذخیره شده را بارگذاری می‌کنند می‌توانید به یکباره به هر 5 کلاس هشدار دهید که یک درخواست موفق شبکه برقرار شده است.

ساختار مقدماتی چنین است:

نکته: تگ obj@ در ابتدای هر تابعی که از طریق selector# فراخوانی شود، ضروری خواهد بود.

گرچه امکان ارسال داده از طریق نوتیفیکیشن وجود دارد، اما به این منظور ابزار بهینه‌ای محسوب نمی‌شوند. در هر حال، بهترین کاربرد آن‌ها برای هشدار به یک کلاس است که داده‌های جدیدی موجود شده‌اند. فرض کنید مدل داده‌ای دارید که در آن داده‌هایی را از شبکه دانلود می‌کنید، زمانی که این داده‌ها در حافظه ذخیره شدند، به کنترلرهای «نما» (View) هشدار می‌دهید تا این داده‌های اخیراً ذخیره شده را در نما وارد کنند. در ادامه مثالی از طرز کار ساختار نوتیفیکیشن را می‌بینید:

نمایندگی

«نمایندگی» (Delegation) روشی است که در اغلب موارد برای برقراری ارتباط بین کلاس‌های مدل، نما و کنترلر مورد استفاده قرار می‌گیرد. در الگوی طراحی نمایندگی از یک پروتکل برای تعریف متدها، مشخصه‌ها و دیگر الزامات مورد نیاز برای پیاده‌سازی یک کلاس استفاده می‌شود. پروتکل را می‌توان به عنوان یک قرارداد تصور کرد که با اجرای قرارداد موجود در پروتکل متعهد می‌شویم الزامات آن را پیاده‌سازی کنیم.

برای پیاده‌سازی الگوی نمایندگی باید یک پروتکل را راه‌اندازی کنیم:

در کلاس متد، یعنی کلاسی که این نمایندگی را بر عهده دارد، باید یک ارجاع ضعیف به ModelDelegate داشته باشید.

نکته: ارجاع به نماینده باید ضعیف یا unowned باشد. با استفاده از یک ارجاع قوی، ممکن است متوجه شوید در حال ایجاد یک چرخه هستید که در آن نماینده ارجاعی به کلاس والد نگه می‌دارد و کلاس والد نیز به نماینده ارجاع دارد. با ایجاد چنین حلقه ارجاع قوی، هر دو شیء در حافظه به همدیگر ارجاع می‌دهند و از این رو ARC به محض «مقدارزدایی» (de-initialization) از شیء نمایندگی شده آن را تخصیص‌زدایی می‌کند.

اکنون یک وهله از Model در کلاس Controller ایجاد می‌کنیم و نماینده آن را به Self انتساب می‌دهیم.

برای انتساب نماینده مدل به Self، باید ViewController با پروتکل ModelDelegate هماهنگ باشد و توجه داشته باشید که در این مثال Self همان کلاس ModelDelegate است. ما می‌توانیم این هماهنگی را بدین طریق به دست آوریم که یک بسط از کنترل نما که از این پروتکل استفاده می‌کند به طرح‌بندی تعریف‌شده در ModelDelegate اضافه کنیم. زمانی که مدل با موفقیت داده‌ها را دانلود کرد، تابع didReceiveData را درون ViewController فراخوانی خواهد کرد. زمانی که این تابع فراخوانی شد، می‌توانید کلاس View را درون ViewController به‌روزرسانی کنید.

Callback

راه‌اندازی Callback-ها ساده است. برخی برنامه نویسان از این روش کمتر استفاده می‌کنند چون پایداری الگوی نمایندگی را بیشتر می‌پسندند. با این حال، Callback-ها برای ایجاد ارتباط‌های ساده مفید هستند.

تصور کنید در یک کلاس نما تابعی داریم که یک انیمیشن را اجرا می‌کند. ما می‌خواهیم به محض تکمیل شدن انیمیشن به ViewController خود هشدار دهیم که انیمیشن به پایان رسیده است.

به این منظور در ViewController یک وهله از کلاس View ایجاد می‌کنیم که تابع ()runAnimation را فراخوانی می‌کند:

نکته: به «weak self in» درون بستار روی ()runAnimation توجه خاصی داشته باشید. با تعیین این self به صورت یک ارجاع ضعیف ما از ایجاد چرخه‌های پایدار جلوگیری می‌کنیم. اگر self را به صورت قوی در اختیار بگیریم، آن گاه بستار یک ارجاع قوی به self می‌گیرد و بنابراین امکان تخصیص‌زدایی از آن در حافظه از دست می‌رود.

همچنین امکان ارسال داده‌ها به صورت مستقیم از طریق Callback وجود دارد:

نکته: کاراکتر زیرخط درون تعریف تابع به آن معنی است که نیازی به گنجاندن نام پارامتر در زمان فراخوانی یک متد نداریم.

سخن پایانی

شما با مطالعه این مقاله با برخی از گزینه‌های برقراری ارتباط در سوئیفت آشنا شدید. اغلب برنامه‌نویسان در پروژه‌های خود از انواع مختلفی از این روش‌های برقراری ارتباط بین کلاس‌ها استفاده می‌کنند، چون هر کدام از آن‌ها کاربردهای خاص خود را دارند. از نمایندگی برای طرح‌بندی پایدار بین کلاس‌ها و اجرای ارتباط‌های زیاد استفاده می‌شود. از Callback برای کارکردهای ساده‌ای مانند ارسال Callback در زمان پایان یافتن یک اکشن استفاده می‌شود. همچنین از نوتیفیکیشن برای ارسال هشدار به چند کلاس جهت اطلاع دادن دانلود شدن داده‌ها یا تغییر یافتن آن‌ها استفاده می‌کنیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر پرسشی درباره این مطلب دارید، آن را با ما مطرح کنید.
منابع:
better-programming
PDF
مطالب مرتبط
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *