如何将函数限制为每 x SWIFT 一次

How to limit function to once in every x SWIFT

所以我在我的应用程序上添加了评论选项,让用户可以对帖子发表评论。它被直接引用并将信息从字符串发送到 api 端点。这行得通,现在我想知道是否有一种方法可以限制对 API 的基本请求数量,以便用户可以每分钟发送一次评论

    TextField("Comment...", text: $comment) { editingChanged in
                    } onCommit: {
                        validate()
                        showsAlert = !isValid
                        if isValid{
                            viewModel.sendComment(nickname: nickname, body: comment) {
                                self.comment = ""
                            }
                        }
                    }
                }
                .padding()
                .frame(width: UIScreen.main.bounds.width, height: 80)
                .ignoresSafeArea(.keyboard, edges: .bottom)
                

这将帮助我减少评论中的垃圾邮件,并且可以挽救生命

在 Swift 中,您可以使用以下方法获取当前时刻的 Unix 时间戳:

let currentUnixTimestamp = Date().timeIntervalSince1970

Unix 时间仅计算自 1970 年 1 月 1 日以来经过的秒数 00:00:00 UTC。请参阅 Wikipedia 以了解更多信息。

使用它,您可以创建一个字段,在每次发送评论时保存当前时间戳,然后根据保存的时间戳检查当前时间。如果您的 viewModel 是 class 类型(我认为是),那么它就是放置此代码的最佳位置。它可能看起来像这样:

class ViewModel {
    // How many seconds to wait before the user can comment again
    private static let cooldownInSeconds = 60

    private var lastSendTimestamp: Int? = nil


    func sendComment(nickname: String, body: String) {
        let currentTime = Date().timeIntervalSince1970

        if currentTime >= (lastSendTimestamp ?? Int.min) + ViewModel.cooldownInSeconds {
            lastSendTimestamp = currentTime
            
            // Send comment here
        } else {
            // Cannot send comment because cooldown has not run out
        }
    }
}

请注意,将变量放在 struct 中(例如您的 View)将无法正常工作,因为它们具有不可变的性质。

你可以创建一个简单的Swiftclass来控制时间。

public class Time_Control:Thread{

    var wait_time:Int //In seconds
    public var can_send:Bool = true

    init(_ wait_time:Int) {
        self.wait_time = wait_time
    }

    public override func start() {
        super.start()

        self.can_send = false
        Thread.self.sleep(forTimeInterval: TimeInterval(self.wait_time))
        self.can_send = true
    }
}

然后您可以在代码的任何部分使用此对象来控制事件之间的时间。为此,首先要有一个变量来存储classTime_Control的对象,例如var control:Time_Control = Time_Control(0)。之后,每次你想控制某事的时间时,只需执行以下操作:

func send_message(){
    if control.can_send{
        //Start the time controller with 60 seconds
        control = Time_Control(60)
        control.start()

        //Let the user send message
        //... your code
    }else{
        //Don't let the user send message
        //...
    }
}

当用户与您的 UI 交互时,您可以调用函数 send_message()。它将允许用户每 60 秒发送一条消息。