مكتبات GraphQL للغة Swift (iOS/macOS): دليل شامل
GraphQL هي لغة استعلام حديثة لواجهات API، تتيح للعملاء طلب البيانات التي يحتاجونها فقط. لمطوري Swift الذين يبنون تطبيقات لنظامي iOS و macOS، توجد مكتبات قوية تسهل التكامل مع خوادم GraphQL. في هذه المقالة، سنستعرض المكتبتين الرئيسيتين: Apollo iOS و Relay (عبر أغلفة Swift)، وسنقدم أمثلة عملية على الكود.
ما هو GraphQL ولماذا هو مهم للغة Swift؟
يحل GraphQL مشكلة الإفراط في جلب البيانات (overfetching) ونقص جلبها (underfetching) التي تظهر غالبًا عند استخدام REST API. في Swift، هذا مهم بشكل خاص لتطبيقات الهواتف المحمولة، حيث يمكن لكل كيلوبايت إضافي من البيانات أن يؤثر على الأداء ووقت التحميل. المزايا الرئيسية لـ GraphQL لنظامي iOS/macOS:
- استعلامات مرنة — يقرر العميل بنفسه الحقول التي سيحصل عليها
- كتابة قوية (Strong Typing) — مخططات GraphQL تولد تلقائيًا أنواع Swift
- دعم الاشتراكات — تحديثات فورية عبر WebSocket
- نقطة دخول موحدة — نقطة نهاية واحدة لجميع الاستعلامات
مكتبة Apollo iOS
Apollo iOS هي مكتبة GraphQL الأكثر شيوعًا للغة Swift، تم تطويرها بواسطة شركة Apollo GraphQL. توفر مجموعة كاملة من الأدوات للعمل مع GraphQL: من توليد الكود إلى التخزين المؤقت ومعالجة الأخطاء.
تثبيت Apollo iOS
للتثبيت، استخدم Swift Package Manager. أضف التبعية إلى ملف Package.swift الخاص بك:
// swift-tools-version:5.7import PackageDescription
let package = Package( name: "MyApp", dependencies: [ .package(url: "https://github.com/apollographql/apollo-ios.git", from: "1.0.0") ], targets: [ .target(name: "MyApp", dependencies: [ .product(name: "Apollo", package: "apollo-ios") ]) ])يمكن أيضًا التثبيت عبر CocoaPods أو Carthage، لكن SPM هي الطريقة الموصى بها.
إعداد عميل Apollo
أنشئ مثيلاً من ApolloClient مع رابط خادم GraphQL الخاص بك:
import Apollo
class NetworkManager { static let shared = NetworkManager() private(set) lazy var apollo: ApolloClient = { let url = URL(string: "https://api.example.com/graphql")! return ApolloClient(url: url) }()}مثال على استعلام باستخدام Apollo iOS
لنفترض أن لديك مخططًا بنوع User وحقول id و name و email. لننشئ استعلامًا:
import Apollo
// تعريف استعلام GraphQL (عادة في ملف .graphql)let query = """ query GetUser($id: ID!) { user(id: $id) { id name email } }"""
// تنفيذ الاستعلامNetworkManager.shared.apollo.fetch(query: query, variables: ["id": "123"]) { result in switch result { case .success(let graphQLResult): if let user = graphQLResult.data?.user { print("User: \\(user.name), Email: \\(user.email)") } case .failure(let error): print("Error: \\(error)") }}لاحظ: يقوم Apollo تلقائيًا بتوليد أنواع Swift لاستعلاماتك (مثل GetUserQuery) إذا كنت تستخدم أداة توليد الكود الخاصة به. للقيام بذلك، قم بتشغيل apollo-ios-cli مع مخططك.
التحويرات (Mutations) والاشتراكات
يدعم Apollo التحويرات (تعديل البيانات) والاشتراكات (الوقت الفعلي). مثال على تحوير:
let mutation = """ mutation UpdateUser($id: ID!, $name: String!) { updateUser(id: $id, name: $name) { id name } }"""
NetworkManager.shared.apollo.pe