Skip to content

Latest commit

 

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Iris

Iris 是一个面向 Swift 6.2 的 Apple 平台网络图片库。它使用 async/await、 结构化并发与 Sendable 构建 cache-first 图片 Pipeline,并将缓存、通用展示和 动画播放拆成可独立选择的 Swift Package 产品。

Iris 目前处于 0.1.0-beta.1 阶段。首个 beta 用于验证公开边界,后续 beta 仍可能包含 source-breaking 调整。

产品

Product 职责
Iris Core Request、默认网络、ImageIO 静态图/GIF 解码、Pipeline 与工作合并
IrisCache Cache Key、Store 合同与 Cache facade 配置入口
IrisPresentation SwiftUI/UIKit 加载 Host、静态默认展示与 Renderer 边界
IrisAnimation 可选的动画播放、Timeline、Player 与 animated Renderer

只使用 IrisPresentation 时,动态结果会稳定显示即时图片(container.image); 需要播放时再额外依赖 IrisAnimation

要求

  • Swift 6.2+
  • iOS 16+
  • macOS 13+
  • tvOS 16+
  • watchOS 9+
  • visionOS 1+

SwiftUI 展示支持上述全部平台;UIKit 展示支持 iOS、tvOS 和 visionOS。

安装

Package.swift 中加入:

dependencies: [
    .package(
        url: "https://github.com/Weixi779/Iris.git",
        exact: "0.1.0-beta.1"
    ),
]

然后按需选择产品:

.target(
    name: "YourApp",
    dependencies: [
        .product(name: "Iris", package: "Iris"),
        .product(name: "IrisPresentation", package: "Iris"),
        // 需要动画播放时添加:
        .product(name: "IrisAnimation", package: "Iris"),
        // 接入自定义缓存 Store 时添加:
        .product(name: "IrisCache", package: "Iris"),
    ]
)

Core

import Foundation
import Iris

let pipeline = ImagePipeline(networkProvider: IrisNetworkProvider())

func loadImage(at url: URL) async throws -> ImageContainer {
    try await pipeline.image(for: ImageRequest(url: url))
}

ImageRequest(url:) 保留原始像素并使用 @1x representation。无 UI 的 Core 不会猜测主屏幕 scale;需要目标尺寸时,应传入已经解析完成的 PixelSizedisplayScale

SwiftUI

静态默认展示:

import Foundation
import Iris
import IrisPresentation
import SwiftUI

private let imagePipeline = ImagePipeline(
    networkProvider: IrisNetworkProvider()
)

struct RemoteCover: View {
    private let imageURL = URL(
        string: "https://example.com/image.jpg"
    )!

    var body: some View {
        NetworkImage(
            imageURL,
            target: CGSize(width: 160, height: 160),
            pipeline: imagePipeline
        )
    }
}

target 使用 point 表达展示意图;IrisPresentation 会结合当前环境的 display scale,将它解析为最大输出像素边界。

选择动画播放:

import IrisAnimation

struct AnimatedRemoteCover: View {
    let imageURL: URL

    var body: some View {
        NetworkImage(
            imageURL,
            target: CGSize(width: 160, height: 160),
            pipeline: imagePipeline,
            renderer: AnimatedNetworkImageRenderer()
        )
    }
}

UIKit 可使用 NetworkImageView,并通过 AnimatedImageViewRenderer 选择动画播放。

Cache

IrisCache 当前提供 ImageStoringImageDataStoringCacheKeyProviding 以及 把它们配置为 Pipeline Cache facade 的入口。首个 beta 不提供默认 Memory/Disk Store;Store 的容量、淘汰、过期、并发安全和物理 Key 编码由接入方负责。

0.1 beta 范围

首个 beta 已包含 cache-first 加载、网络与解码工作合并、ImageIO 静态图/GIF 解码、SwiftUI/UIKit 静态展示,以及可选动画播放。

本次 beta 不包含:

  • 默认 Memory/Disk Cache Store;
  • SVG、QOI 等额外格式及格式插件注册表;
  • Image Processor;
  • Progress、Profiler 与公开事件流;
  • Retry、placeholder、transition 和自动 View 尺寸测量;
  • 视频加载与播放。

动画播放不会自动采用 Reduce Motion 策略;应用可以通过 AnimatedNetworkImageRenderer(playsAnimation:) 自行决定是否播放。

这些能力不会阻塞 0.1.0-beta.1,只会在出现真实 Consumer 后重新评估。

设计文档

License

Iris 使用 MIT License

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages