IOS-INFO-013 P0 | 本地 ReadingEventUploadQueue 【审计: 不存在】 #78

Closed
opened 2026-06-07 11:55:27 +08:00 by wangdl · 1 comment
Owner

致命F2: 无上传队列

ReadingEventQueueItem{id, eventId, userId?, payload, status: pending|uploading|retrying|failedPermanent, retryCount, lastErrorCode?, lastTriedAt?, createdAt, updatedAt}。enqueue/fetchBatch(100)/markUploading/markUploaded/markRetry/markPermanentFailed/countPending。App重启不丢。SQLite/CoreData实现。

## 致命F2: 无上传队列 ReadingEventQueueItem{id, eventId, userId?, payload, status: pending|uploading|retrying|failedPermanent, retryCount, lastErrorCode?, lastTriedAt?, createdAt, updatedAt}。enqueue/fetchBatch(100)/markUploading/markUploaded/markRetry/markPermanentFailed/countPending。App重启不丢。SQLite/CoreData实现。
wangdl added this to the M-IOS-INFO:学习信息采集、上传、继续学习与基础分析闭环 milestone 2026-06-07 11:55:27 +08:00
wangdl changed title from IOS-INFO-010 P0 | 本地 ReadingEventUploadQueue to IOS-INFO-013 P0 | 本地 ReadingEventUploadQueue 【审计: 不存在】 2026-06-07 12:20:49 +08:00
Author
Owner

完成报告

交付

Features/MaterialReader/ReadingEventUploadQueue.swift — 2 个核心类:

1. ReadingEventUploadQueue — 本地持久化队列:

@MainActor
final class ReadingEventUploadQueue {
    // 持久化: JSON → Documents/reading_event_queue.json

    func enqueue(_ items: [ReadingEventUploadItem])
    func fetchPendingBatch(limit: 100) -> [ReadingEventQueueItem]
    func markUploading(ids:) / markUploaded(ids:)     // 成功后移除
    func markRetry(ids:, errorCode?)                   // 上限 3 次 → failedPermanent
    func markPermanentFailed(ids:, errorCode?)          // 不再重试
    func retryFailed()                                  // failed → pending
    func clearAll() / clearPermanentFailed()
    var pendingCount / failedCount
}

状态机: pending → uploading → (uploaded移除 | failed → retry → pending | failedPermanent)

2. ReadingEventUploadPipeline — 编排层:

@MainActor
final class ReadingEventUploadPipeline {
    func exportAndEnqueue(contexts)     // Rust export → mapper → enqueue
    func flush() async                  // fetchPending → API upload → ack/markFailed
    func reloadOnLaunch(contexts)       // App 启动: reloadStale + cleanup + export + retryFailed
}
## 完成报告 ### 交付 `Features/MaterialReader/ReadingEventUploadQueue.swift` — 2 个核心类: **1. `ReadingEventUploadQueue` — 本地持久化队列:** ```swift @MainActor final class ReadingEventUploadQueue { // 持久化: JSON → Documents/reading_event_queue.json func enqueue(_ items: [ReadingEventUploadItem]) func fetchPendingBatch(limit: 100) -> [ReadingEventQueueItem] func markUploading(ids:) / markUploaded(ids:) // 成功后移除 func markRetry(ids:, errorCode?) // 上限 3 次 → failedPermanent func markPermanentFailed(ids:, errorCode?) // 不再重试 func retryFailed() // failed → pending func clearAll() / clearPermanentFailed() var pendingCount / failedCount } ``` **状态机:** pending → uploading → (uploaded移除 | failed → retry → pending | failedPermanent) **2. `ReadingEventUploadPipeline` — 编排层:** ```swift @MainActor final class ReadingEventUploadPipeline { func exportAndEnqueue(contexts) // Rust export → mapper → enqueue func flush() async // fetchPending → API upload → ack/markFailed func reloadOnLaunch(contexts) // App 启动: reloadStale + cleanup + export + retryFailed } ```
Sign in to join this conversation.
No description provided.