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: Также в библиотеке
Конфигурация приложений Rust: библиотека `config` для гибкой настройки
csv для Rust: полное руководство с примерами
Генератор QR-кодов на Swift: Core Image, CIFilter и собственные решения
Интеграция Prometheus метрик в приложениях на Kotlin: полное руководство
pybind11 для C++: полное руководство с примерами