Использование GraphQL в Swift: библиотеки Apollo и Relay для iOS/macOS

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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:

  • Гибкие запросы — клиент сам решает, какие поля получать
  • Сильная типизация — схемы GraphQL автоматически генерируют Swift-типы
  • Поддержка подписок — real-time обновления через WebSocket
  • Единая точка входа — один endpoint для всех запросов

Библиотека Apollo iOS

Apollo iOS — это наиболее популярная GraphQL-библиотека для Swift, разработанная компанией Apollo GraphQL. Она предоставляет полный набор инструментов для работы с GraphQL: от генерации кода до кэширования и обработки ошибок.

Установка Apollo iOS

Для установки используйте Swift Package Manager. Добавьте зависимость в ваш Package.swift:

// swift-tools-version:5.7
import 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 с URL вашего 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 с вашей схемой.

Мутации и подписки

Apollo поддерживает мутации (изменение данных) и подписки (real-time). Пример мутации:

let mutation = """
    mutation UpdateUser($id: ID!, $name: String!) {
        updateUser(id: $id, name: $name) {
            id
            name
        }
    }
"""

NetworkManager.shared.apollo.perform(mutation: mutation, variables: ["id": "123", "name": "New Name"]) { result in
    // Обработка результата
}

Для подписок используется WebSocket. Настройка требует дополнительного транспорта, но Apollo предоставляет готовые классы для этого.

Библиотека Relay для Swift

Relay — это фреймворк от Facebook для работы с GraphQL на клиенте. Изначально написан на JavaScript, но существует Swift-обёртка RelaySwift, которая адаптирует его для iOS/macOS. Relay ориентирован на сложные приложения с большим количеством взаимосвязанных данных и автоматическим управлением кэшем.

Установка RelaySwift

Добавьте пакет через SPM:

.package(url: "https://github.com/relay-swift/relay-swift.git", from:                    

Рекомендаций