最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

swift - Supabase - RealtimePostgresChange - issue - Stack Overflow

programmeradmin0浏览0评论

I have inherited the following code and unfortunately after 5 days of debugging I have not made much progress and I would be forever grateful if anybody could debug it for me, I am totally at a loss on this.

Xcode is producing the following errors:

Cannot find type 'RealtimePostgresChange' in scope

Value of type 'AsyncStream<InsertAction>' has no member 'onReceive'

Code:

import Supabase
import Combine
import SwiftUI
import PostgREST

// 6. Message Service
@MainActor
class MessageService: ObservableObject {
    @Published var messages: [Message] = []
    @Published var error: Error?

    private let supabase: SupabaseClient
    private var channel: RealtimeChannelV2?
    private(set) var currentUserId: UUID?

    init(supabase: SupabaseClient, userId: UUID?) {
        self.supabase = supabase
        self.currentUserId = userId
    }

    func fetchMessages() async {
        do {
            let messages: [Message] = try await supabase
                .from("messages")
                .select()
                .order("created_at", ascending: true)
                .execute()
                .value

            self.messages = messages
        } catch {
            self.error = error
        }
    }

    func sendMessage(content: String) async {
        guard !content.isEmpty, let userId = currentUserId else { return }

        let message = Message(
            id: UUID(),
            content: content,
            user_id: userId,
            created_at: Date(), deleted_at: nil
        )

        do {
            try await supabase
                .from("messages")
                .insert(message)
                .execute()
        } catch {
            self.error = error
        }
    }
    
  
    func subscribeToRealtime() async {
        
        channel = supabase.realtimeV2.channel("messages")

        let changes = channel?.postgresChange(
            
            Realtime.InsertAction.self,
            schema: "public",
            table: "messages"
        )
        
        changes?.onReceive { [weak self] (changes: [RealtimePostgresChange<Message>]) in
            guard let self else { return }
            
            for change in changes {
                let newMessage = change.new
                
                if !self.messages.contains(where: { $0.id == newMessage.id }) {
                    self.messages.append(newMessage)
                }
            }
        }

        Task {
            do {
                try await channel?.subscribe()
            } catch {
                self.error = error
            }
        }
    }
       func updateUserId(_ newId: UUID?) {
        currentUserId = newId
    }
}

I have tried replacing RealtimePostgresChange with RealtimeMessage but that seems to cause several other issues.

发布评论

评论列表(0)

  1. 暂无评论