مقدمة إلى GraphQL وSwift
\nGraphQL هي لغة استعلام لواجهات API تتيح للعملاء الحصول على البيانات التي يحتاجونها بالضبط دون أي زيادة. لمطوري iOS وmacOS، يفتح دمج GraphQL إمكانيات جديدة لإنشاء تطبيقات جوال فعالة ومرنة. في هذا الدليل التعليمي، سنشرح عمليًا كيفية ربط GraphQL API بمشروع Swift، وتنفيذ الاستعلامات والطفرات الأساسية، بالإضافة إلى معالجة الأخطاء المحتملة.
\nعلى عكس REST التقليدي، يتيح GraphQL طلب موارد متعددة في استعلام واحد، وهو أمر مهم بشكل خاص للأجهزة المحمولة ذات حركة المرور المحدودة. سنستخدم المكتبة الشهيرة Apollo iOS - الحل الأكثر استقرارًا وتوثيقًا للعمل مع GraphQL على Swift.
\n\nتحضير المشروع وتثبيت Apollo iOS
\nالخطوة 1: إنشاء المشروع وتثبيت التبعيات
\nافتح Xcode وأنشئ مشروع iOS جديد (أو macOS). للعمل مع GraphQL، سنقوم بتثبيت Apollo iOS عبر Swift Package Manager (SPM).
\n- \n
- في Xcode، اختر
File → Add Packages\n - أدخل رابط المستودع:
https://github.com/apollographql/apollo-ios.git\n - اختر أحدث إصدار مستقر (في وقت الكتابة - 1.15+) \n
- أضف الحزمة إلى هدفك \n
الخطوة 2: توليد الكود بناءً على مخطط GraphQL
\nيستخدم Apollo iOS توليد الكود: تصف الاستعلامات في ملفات .graphql، وتقوم الأداة بإنشاء كود Swift بنماذج بيانات محددة. للقيام بذلك، يجب:
- \n
- إنشاء مجلد
GraphQLفي المشروع \n - وضع ملف
schema.graphqls(مخطط API الخاص بك) فيه - يمكن الحصول عليه عادةً عبر introspection \n - إنشاء ملف استعلام، مثل
GetUser.graphql: \n
query GetUser($id: ID!) {\n user(id: $id) {\n id\n name\n email\n posts {\n title\n }\n }\n}\n\nثم أضف Build Phase لتشغيل مولد الكود. أسهل طريقة هي تثبيت Apollo CLI عبر Homebrew:
\nbrew install apollo-ios-cli\n\nونفذ الأمر في جذر المشروع:
\n./apollo-ios-cli generate\n\nبعد ذلك، ستظهر ملفات Swift المُنشأة مع نماذج البيانات في مجلد Sources/API.
تنفيذ استعلامات GraphQL الأساسية
\nإعداد عميل Apollo
\nأنشئ مثيلاً لعميل Apollo مع تحديد رابط نقطة نهاية GraphQL الخاصة بك. يتم ذلك عادةً في AppDelegate أو في فئة خدمة منفصلة:
\n\nimport Apollo\n\nclass NetworkService {\n static let shared = NetworkService()\n private(set) lazy var apollo: ApolloClient = {\n let url = URL(string: "https://your-api.com/graphql")!\n return ApolloClient(url: url)\n }()\n}\n\nاستعلام البيانات (Query)
\nالآن سنقوم بتنفيذ استعلام لجلب مستخدم. سينشئ الكود المُنشأ هيكل GetUserQuery:
import Foundation\n\nclass UserViewModel: ObservableObject {\n @Published var user: User?\n @Published var errorMessage: String?\n \n func fetchUser(id: String) {\n NetworkService.shared.apollo.fetch(query: GetUserQuery(id: id)) { [weak self] result in\n DispatchQueue.main.async {\n switch result {\n case .success(let graphQLResult):\n if let userData = graphQLResult.data?.user {\n self?.user = User(\n id: userData.id,\n name: userData.name,\n email: userData.email\n )\n }\n case .failure(let error):\n self?.errorMessage = "خطأ: \\(error.localizedDescription)"\n }\n }\n }\n }\n}\n\nلاحظ: نستخدم @Published لتحديث واجهة المستخدم بشكل تفاعلي في