iOS相册多选与删除实战:权限、交互与PHPhotoLibrary避坑指南
简介本资源面向iOS开发初学者与中级开发者聚焦相册图片多选与删除这一常见交互需求适用于社交、图片编辑类应用的开发场景。内容围绕第三方库QBImagePickerController展开讲解如何集成图片选择器、配置多选与最大选择数量、同步已选图片URL并结合自定义模型ShowEditItem管理选中数据。资源包共1个PDF文件大小约77KB以图文形式呈现完整实现思路涵盖拍照与相册选取的结合、删除照片后重新添加时的相册状态维护、数组操作逻辑以及图片压缩上传的尺寸调整与质量控制方法。目前已有288人学习下载适合希望快速掌握系统相册调用、多选删除交互与数据同步的开发者参考也可作为权限检查、错误处理与用户体验优化的实践起点。1. 相册多选与删除从系统能力边界到可落地实现做 iOS 相册多选和删除第一件要认清的事是你不可能绕过系统相册的授权模型去删照片。很多刚接触这个需求的开发者会想当然地以为只要拿到相册读取权限就能顺手把图删了结果真机一跑PHPhotoLibrary.shared().performChanges直接抛PHPhotosError.accessRestricted或者干脆静默失败。这不是玄学是 iOS 从 8 开始就把「读」和「写/删」拆成了两套权限语义到 iOS 14 又加了「有限访问」这一层权限状态从二值变成了三值甚至四值。这个标题要解决的核心问题其实有两块一是多选交互——怎么让用户像系统相册那样框选、连选、跨分组选二是删除落地——怎么把选中的PHAsset安全地提交给系统删除并且处理好失败回滚和 UI 同步。适合谁看正在做图片选择器、相册清理工具、社交 App 发帖选图模块的 iOS 开发者尤其是那些已经用上了QBImagePickerController这类第三方库、但发现删除环节还得自己接系统 API 的人。我先把结论摆前面多选用UICollectionView的allowsMultipleSelection配合自定义手势能覆盖 90% 场景删除必须走PHPhotoLibrary的performChanges且删除前一定要二次确认因为系统删除是进「最近删除」而非物理抹除用户后悔药只有 30 天。下面几章我会把权限、多选、删除、避坑、进阶验证一条线讲透。2. 权限与数据模型删除功能的前置条件2.1 读权限和写权限是两码事别混着申请iOS 相册权限在Info.plist里对应两个 keyNSPhotoLibraryUsageDescription读和NSPhotoLibraryAddUsageDescription写/增。注意删除属于「写」范畴但系统并没有单独的「删除权限」key删除能力依附在PHPhotoLibrary的变更权限上。也就是说用户如果只给了读权限你调删除一样会失败。从 iOS 14 开始读权限多了「有限访问」Limited状态。用户可能只授权你访问他挑出来的那几张图。这时候你的多选列表里能看到的PHAsset就是有限的删除也只能删这些。判断当前权限状态的标准写法import Photos func checkPhotoAuthorization() - PHAuthorizationStatus { // iOS 14 用 readWrite 参数低版本用 authorizationStatus() if #available(iOS 14, *) { return PHPhotoLibrary.authorizationStatus(for: .readWrite) } else { return PHPhotoLibrary.authorizationStatus() } } func requestPhotoAuthorization(completion: escaping (PHAuthorizationStatus) - Void) { if #available(iOS 14, *) { PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in DispatchQueue.main.async { completion(status) } } } else { PHPhotoLibrary.requestAuthorization { status in DispatchQueue.main.async { completion(status) } } } }逻辑说明.readWrite这个参数是关键它申请的是读写权限用户弹窗里会明确写「允许访问和修改照片」。如果你用.addOnly那只能往相册加图删不了。参数上requestAuthorization的回调不在主线程UI 更新必须切回 main。权限状态有五种.notDetermined、.restricted、.denied、.authorized、.limited。前三种基本没法删.limited要引导用户去「设置 → 你的 App → 照片 → 选中的照片」里扩权.authorized才是完全体。2.2 PHAsset 是句柄不是图片删除靠 localIdentifier很多人第一次用PHAsset会懵它不持有图片数据只是一个轻量句柄。你真正要删的时候靠的是它的localIdentifier。多选场景下我一般用一个SetString存选中的 identifier而不是存PHAsset对象本身因为PHAsset在相册变更后可能失效identifier 更稳。// 选中集合存 localIdentifier private var selectedIdentifiers SetString() // 从 PHFetchResult 里取资源 let fetchOptions PHFetchOptions() fetchOptions.sortDescriptors [NSSortDescriptor(key: creationDate, ascending: false)] let assets PHAsset.fetchAssets(with: .image, options: fetchOptions) // 遍历时把 identifier 存起来 assets.enumerateObjects { asset, _, _ in // asset.localIdentifier 就是删除时要用的钥匙 }参数说明PHFetchOptions的sortDescriptors按创建时间倒序和系统相册一致predicate可以过滤媒体类型比如只要图片就mediaType PHAssetMediaType.image。注意fetchAssets返回的是PHFetchResult它是懒加载的别一上来就enumerateObjects全量转数组几千张图会卡。提示localIdentifier在设备间不通用做云同步或跨端时不能拿它当业务主键只能当本地删除句柄。3. 多选交互用 UICollectionView 复刻系统相册的框选体验3.1 基础多选allowsMultipleSelection 只是起点UICollectionView自带allowsMultipleSelection true点一下选中、再点取消这是最省事的做法。但系统相册那种「长按进入选择模式、滑动连选、顶部显示已选数量」的体验光靠这个属性不够。我一般会加一个isEditing状态进入编辑模式后才开启多选避免和普通点击冲突。collectionView.allowsMultipleSelection false // 默认关闭 objc func enterEditMode() { isEditing true collectionView.allowsMultipleSelection true // 刷新导航栏显示取消和删除按钮 updateNavBarForEditing() } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { guard isEditing else { return } let asset assets[indexPath.item] selectedIdentifiers.insert(asset.localIdentifier) updateSelectedCountLabel() } func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { let asset assets[indexPath.item] selectedIdentifiers.remove(asset.localIdentifier) updateSelectedCountLabel() }逻辑说明didSelectItemAt和didDeselectItemAt是成对的选中集合的增删必须同步否则会出现「UI 上没勾但集合里有」的错位。updateSelectedCountLabel负责刷新「已选 N 张」的文案。3.2 滑动连选手势 indexPathsForVisibleItems 的配合系统相册最爽的是手指按住一划一排全选上。这个用UIPanGestureRecognizer实现。核心思路是手势移动时拿到当前触摸点对应的 indexPath判断是「选中」还是「取消」方向然后批量操作。objc func handlePan(_ gesture: UIPanGestureRecognizer) { let location gesture.location(in: collectionView) guard let indexPath collectionView.indexPathForItem(at: location) else { return } switch gesture.state { case .began: // 记录起始点的选中状态决定这一划是选还是取消 let asset assets[indexPath.item] isSelecting !selectedIdentifiers.contains(asset.localIdentifier) case .changed: // 只处理可见的 cell避免全量遍历 for visibleIndexPath in collectionView.indexPathsForVisibleItems { let asset assets[visibleIndexPath.item] if isSelecting { selectedIdentifiers.insert(asset.localIdentifier) collectionView.selectItem(at: visibleIndexPath, animated: false, scrollPosition: []) } else { selectedIdentifiers.remove(asset.localIdentifier) collectionView.deselectItem(at: visibleIndexPath, animated: false) } } default: break } }参数说明indexPathsForVisibleItems只返回当前屏幕内的 cell滑动时随着滚动会动态变化所以连选是「划到哪选到哪」。isSelecting这个布尔值在.began时定调保证一次滑动方向一致不会划着划着变成反选。注意手势要设cancelsTouchesInView false否则会吃掉 cell 的点击事件。3.3 第三方库 QBImagePickerController 的取舍热搜里出现了QBImagePickerController这是个老牌的多选库Objective-C 写的支持多选、限制最大数量、按相册分组。它的优点是接入快QBImagePickerController直接 push 出来就能用缺点是它只管选不管删删除还得你自己拿PHAsset去调系统 API。而且它对新系统「有限访问」的支持要看版本老版本在 iOS 14 上可能显示不全。我的建议如果只是要个选图界面QBImagePickerController 能省事但如果你要做「相册清理」这种删除是核心功能的 App自己用UICollectionViewPHFetchResult搭更可控因为你需要精确控制选中集合和删除后的 UI 刷新。选型上没有绝对对错看你的删除逻辑复杂度。4. 删除落地performChanges 的提交、回滚与 UI 同步4.1 删除 API 的正确调用姿势删除的唯一正道是PHPhotoLibrary.shared().performChanges里面调PHAssetChangeRequest.deleteAssets。注意它接收的是NSFastEnumeration可以传NSArray或PHFetchResult。func deleteSelectedAssets(completion: escaping (Bool, Error?) - Void) { // 用 identifier 重新 fetch 出 PHAsset避免持有失效对象 let fetchResult PHAsset.fetchAssets(withLocalIdentifiers: Array(selectedIdentifiers), options: nil) PHPhotoLibrary.shared().performChanges({ PHAssetChangeRequest.deleteAssets(fetchResult) }) { success, error in DispatchQueue.main.async { if success { self.selectedIdentifiers.removeAll() self.isEditing false self.reloadDataSource() // 重新拉取相册数据 } completion(success, error) } } }逻辑说明为什么不在闭包里直接用之前存的PHAsset数组因为从用户选中到点删除之间相册可能已经变了比如别的 App 删了图直接传旧对象可能失败。用fetchAssets(withLocalIdentifiers:)重新取一遍拿到的是当前有效的句柄。performChanges的 completion 在任意线程UI 操作必须切主线程。参数说明deleteAssets传PHFetchResult或[PHAsset]都行但传PHFetchResult性能更好它不会一次性把对象全实例化。删除成功后一定要reloadDataSource重新PHAsset.fetchAssets拉一遍否则 collectionView 的 indexPath 和底层数据会对不上直接崩。4.2 删除失败的三种典型错误与处理删除不是每次都成功常见错误码有三类错误触发场景处理方式PHPhotosError.accessRestricted权限不足或家长控制提示用户去设置开权限PHPhotosError.identifierNotFoundasset 已被其他进程删除忽略该条刷新列表PHPhotosError.userCancelled用户在系统弹窗点了取消不报错静默恢复 UIuserCancelled这个特别容易被忽略。iOS 在删除时如果涉及 iCloud 照片可能会弹一个系统确认框用户点取消success就是 falseerror是userCancelled。这时候你如果把选中状态清了用户会一脸懵——我明明没删成功怎么勾都没了。正确做法是只有success true才清空选中集合。PHPhotoLibrary.shared().performChanges({ PHAssetChangeRequest.deleteAssets(fetchResult) }) { success, error in DispatchQueue.main.async { if success { self.selectedIdentifiers.removeAll() self.reloadDataSource() } else if let error error as? PHPhotosError, error.code .userCancelled { // 用户取消保持选中状态不变 } else { self.showErrorAlert(error) } } }4.3 删除后的 UI 同步别让 indexPath 变成定时炸弹删除成功后底层PHFetchResult变了但 collectionView 还拿着旧的numberOfItems。如果你直接collectionView.deleteItems(at:)而不更新数据源下一次cellForItemAt就会越界崩溃。我的习惯是删除后整体 reload虽然动画糙一点但稳。func reloadDataSource() { let options PHFetchOptions() options.sortDescriptors [NSSortDescriptor(key: creationDate, ascending: false)] assets PHAsset.fetchAssets(with: .image, options: options) collectionView.reloadData() updateSelectedCountLabel() }如果非要保留删除动画那必须先用performBatchUpdates把数据源和 UI 一起改顺序不能错先改数据源数组再调deleteItems。但PHFetchResult不支持随机删除你得先转成[PHAsset]数组。转数组的代价是内存几千张图问题不大几万张就要慎重。注意删除操作如果涉及 iCloud 共享相册或「最近删除」里的内容行为会有差异。共享相册的删除是移除共享关系不是删原图别搞混。5. 避坑与排查那些让我加班到凌晨的相册删除问题5.1 现象删除后 App 闪退日志报 indexPath 越界原因删除成功后没有重新 fetch 数据源collectionView 的 item 数和PHFetchResult.count不一致cellForItemAt访问了不存在的 index。解决删除回调里先reloadDataSource()再reloadData()或者用performBatchUpdates严格同步数据源和 UI。我现在的习惯是删除后一律全量 reload不省这点动画。5.2 现象用户给了权限删除还是失败error 是 accessRestricted原因用户给的是「有限访问」Limited只能看到部分照片删除这些之外的照片会被拒。或者用户在系统设置里开了「屏幕使用时间」的内容限制。解决检测PHAuthorizationStatus.limited引导用户点「管理」去扩权。代码里用PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: viewController)直接拉起系统的有限库选择器。5.3 现象多选滑动时选中的 cell 高亮状态和集合对不上原因selectItem(at:)只改 UI 不改数据源didSelectItemAt只改数据源不改 UI两者没同步。滑动连选时如果只调了其中一个就会出现「勾了但没高亮」或「高亮了但没勾」。解决封装一个setSelected(_ selected: Bool, at indexPath: IndexPath)方法里面同时改selectedIdentifiers和调selectItem/deselectItem所有入口都走这个方法。5.4 现象删除大量照片时 App 卡死或内存暴涨原因一次性把几万张PHAsset转成数组或者performChanges里传了巨大的数组主线程被阻塞。解决分批删除每批 500 张左右用递归或DispatchGroup串行提交。PHFetchResult本身是懒加载的尽量别转数组。删除期间给个 loading 遮罩别让用户以为卡了。5.5 现象iOS 14 以下正常iOS 14 权限弹窗不出现原因Info.plist里只加了NSPhotoLibraryUsageDescription没加NSPhotoLibraryAddUsageDescription或者申请时用了旧的requestAuthorization()没带.readWrite。解决两个 key 都加上申请时用requestAuthorization(for: .readWrite)。iOS 14 如果只申请.addOnly弹窗文案是「添加照片」用户不会意识到你还要删。6. 进阶验证用 PHPhotoLibraryChangeObserver 做删除后的实时同步前面讲的删除都是「自己删自己刷新」但真实场景里用户可能切到系统相册删了图再切回你的 App这时候你的列表还是旧的。要解决这个得用PHPhotoLibraryChangeObserver。class AlbumViewController: UIViewController, PHPhotoLibraryChangeObserver { override func viewDidLoad() { super.viewDidLoad() PHPhotoLibrary.shared().register(self) } deinit { PHPhotoLibrary.shared().unregisterChangeObserver(self) } func photoLibraryDidChange(_ changeInstance: PHChange) { // 必须在主线程更新 UI DispatchQueue.main.async { guard let collectionChanges changeInstance.changeDetails(for: self.assets) else { return } // 用 changeDetails 后的 fetchResult 替换旧的 self.assets collectionChanges.fetchResultAfterChanges self.collectionView.reloadData() } } }逻辑说明photoLibraryDidChange会在相册任何变更时被调用包括你自己删的、别的 App 删的、iCloud 同步下来的。changeDetails(for:)返回一个PHFetchResultChangeDetails里面的fetchResultAfterChanges就是变更后的结果集。直接替换再 reload比手动算增删索引稳得多。参数说明register和unregister必须成对一般在viewDidLoad和deinit里。回调不在主线程UI 操作必须切 main。如果你的列表是分组的按日期或相册要对每个PHFetchResult分别调changeDetails。验证方法上我一般做三个测试一是自己删一张看列表是否实时少一张二是切到系统相册删一张再切回来看是否同步三是开 iCloud 照片在另一台设备删看本机是否收到变更。第三个最容易被忽略但恰恰是线上反馈最多的场景。说个我的血泪习惯任何涉及PHAsset的列表我都默认注册 changeObserver哪怕当前需求没要求实时同步。因为用户不会按你的预期操作他删完图切回来发现列表没变第一反应就是「这 App 有 bug」。提前接上 observer省掉后面一堆「为什么删了还在」的客诉。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI生成UI的工程边界:Solaris实测与前端工作流接入指南

AI生成UI的工程边界:Solaris实测与前端工作流接入指南

1. 当设计稿开始自己写代码:AI 生成 UI 到底改变了什么Runway Solaris 发布之后,我身边的前端群里炸了锅。有人兴奋地说“以后不用写 CSS 了”,也有人冷笑“又一个玩具”。我花了整整两周时间,把 Solaris 生成的各种 UI 界面往真实…

2026/9/25 2:27:07 阅读更多 →
Mac 磁盘工具说“无法修复“?试试这款磁盘修复工具:DiskWarrior 完整指南

Mac 磁盘工具说“无法修复“?试试这款磁盘修复工具:DiskWarrior 完整指南

Mac 磁盘工具说"无法修复"?试试这款磁盘修复工具:DiskWarrior 完整指南 【免费下载链接】awesome-macOS  A curated list of awesome applications, softwares, tools and shiny things for macOS. 项目地址: https://gitcode.com/GitHub…

2026/9/25 2:26:07 阅读更多 →
【Dify】智能文献检索与问答工作应用

【Dify】智能文献检索与问答工作应用

智能文献对话助手基于Dify AI平台,将复杂的学术论文内容转化为可交互的知识体系。通过智能化流程,学术资料的理解和检索效率大幅提升,适用于科研、学习和信息整理等多元场景。 本文介绍智能文献对话助手的核心原理、关键节点配置及典型应用场景,帮助自学者高效搭建和使用该…

2026/9/25 2:26:07 阅读更多 →

最新新闻

RTX 4060 8GB显存跑7B模型:llama.cpp调参实战与FlashAttention优化

RTX 4060 8GB显存跑7B模型:llama.cpp调参实战与FlashAttention优化

1. 为什么偏偏是 RTX 4060 跑 7B 模型这件事值得聊手里有张 RTX 4060,8GB 显存,笔记本端还是桌面端其实差别不小,但核心矛盾是一样的:想跑 7B 级别的模型,显存刚好卡在“能跑但跑不快”的尴尬位置。我前后折腾了差不多…

2026/9/25 3:08:36 阅读更多 →
CentOS 7/8/9 源码编译安装 MySQL 8.0 完整指南

CentOS 7/8/9 源码编译安装 MySQL 8.0 完整指南

聊到在 Linux 上装 MySQL 8.0,很多人第一反应就是yum install mysql-server,或者去官网拖一个二进制包解压完事。但我实际接触过的不少环境,最后还是老老实实走了一遍源码编译安装,倒不是故意跟自己的时间过不去,而是定…

2026/9/25 3:08:36 阅读更多 →
深度揭秘手势识别模块:I2C 0x39寄存器指令与手势识别原理终极解析

深度揭秘手势识别模块:I2C 0x39寄存器指令与手势识别原理终极解析

深度揭秘手势识别模块:I2C 0x39寄存器指令与手势识别原理终极解析 【免费下载链接】gesture-recognition 源师兄扩展项目: 手势识别 | 由源师兄组织创建 项目地址: https://gitcode.com/yuanshixiong/gesture-recognition 本文以大师兄板的 gesture-recognit…

2026/9/25 3:08:36 阅读更多 →
蓝桥杯真题导入QDUOJ:题包制作、批量导入与避坑指南

蓝桥杯真题导入QDUOJ:题包制作、批量导入与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 3:08:36 阅读更多 →
Apache Iceberg JDBC Catalog 集成指南:用关系数据库管理 Iceberg 表元数据

Apache Iceberg JDBC Catalog 集成指南:用关系数据库管理 Iceberg 表元数据

数据湖大数据数据存储 【免费下载链接】iceberg Apache Iceberg 项目地址: https://gitcode.com/gh_mirrors/icebe/iceberg 点击查看 免费下载 JDBC Catalog 是 Apache Iceberg 提供的一种轻量级 Catalog 实现,它把 Iceberg 表的元数据(meta…

2026/9/25 3:08:36 阅读更多 →
OpenChamber 移动端(iOS/Android)Capacitor 壳工程实践指南:从构建管线、原生能力到上架就绪

OpenChamber 移动端(iOS/Android)Capacitor 壳工程实践指南:从构建管线、原生能力到上架就绪

AI Agent人工智能代码智能体交互助手 【免费下载链接】openchamber Agentic Development Environment based on OpenCode AI agent 项目地址: https://gitcode.com/gh_mirrors/op/openchamber 点击查看 免费下载 导读:本文围绕 packages/mobile/HANDOFF…

2026/9/25 3:07:35 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →