首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >每天在特定时间调用函数一次Swift

每天在特定时间调用函数一次Swift
EN

Stack Overflow用户
提问于 2018-06-10 08:13:35
回答 1查看 3.5K关注 0票数 1

我有一个表视图,我想在每天的特定时间(用户在选取器中输入)清空它。这是它大部分工作的代码,但是假设用户在晚上7点打开应用程序,更新时间是晚上8点,数据没有被删除(这是正确的),但是当时间是在同一天晚上9点,应用程序被打开时,数据没有被删除(这是不正确的)。我认为这与lastRefreshDate每次打开应用程序时都会更新有关,并且必须从lastRefreshDate而不是从userPickedHour等待24小时。应用程序应该像这样工作,有一个设定的时间下午7点因此,当用户打开应用程序时,应用程序应该在第二天晚上7点或晚上7点之后删除数据,但如果用户在第二天晚上7点之前打开应用程序,就不应该删除数据。

代码如下:

class RefreshManager: NSObject {

static let shared = RefreshManager()
private let defaults = UserDefaults.standard
private let defaultsKey = "lastRefresh"
private let calender = Calendar.current



func loadDataIfNeeded(completion: (Bool) -> Void) {

    if isRefreshRequired() {
        // load the data
        defaults.set(Date(), forKey: defaultsKey)
        print("xxxxxx")
        completion(true)
    } else {
        print("yyyyyy")
        completion(false)
    }
}

private func isRefreshRequired(userPickedHour: Int = 16) -> Bool {
    let SleepPickerdate = UserDefaults.standard.object(forKey: "SleepDate") as? Date
    let userPickedHour = Calendar.current.component(.hour, from: (SleepPickerdate)!)
    print(userPickedHour)

    guard let lastRefreshDate = defaults.object(forKey: defaultsKey) as? Date else {
        return true
    }

    if let diff = calender.dateComponents([.hour], from: lastRefreshDate, to: Date()).hour,
        let currentHour =  calender.dateComponents([.hour], from: Date()).hour,
        diff >= 24, userPickedHour >= currentHour {

        print("Delete TableView")
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "Delete"), object: nil)
        print(diff)
        return true

    } else {

        print("Don't Delete TableView")

        return false


      }
    }
  }



class ViewController: UIViewController {

let refreshManager = RefreshManager.shared

override func viewDidLoad() {
    super.viewDidLoad()

    refreshManager.loadDataIfNeeded() { success in
        print(success)
    }
  }
}
EN

回答 1

Stack Overflow用户

发布于 2020-05-17 12:05:46

简单样本

例如,我们可以在"lastRefresh“中设置下一次更新日期,因此,当该日期过去时,它将再次刷新它为下一次刷新设置日期。

class RefreshManager: NSObject {

static let shared = RefreshManager()
private let defaults = UserDefaults.standard
private let defaultsKey = "lastRefresh"
private let calender = Calendar.current

func loadDataIfNeeded(completion: (Bool) -> Void) {
    if isRefreshRequired() {
        var date = Date()
        
        //Check for duration (Daily, Weekly or Monthly) (0,1,2)
        switch SaveManager.shared.user()!.UserShare.duration {
        case 0:
            //If user want to share daily
            date = date.addComponentsToDate(seconds: 0, minutes: 0, hours: 0, days: 1, weeks: 0, months: 0, years: 0)
            break
            
        case 1:
            //If user want to share weekly
            date = date.addComponentsToDate(seconds: 0, minutes: 0, hours: 0, days: 0, weeks: 1, months: 0, years: 0)
            break
            
        case 2:
            //If user want to share monthly
            date = date.addComponentsToDate(seconds: 0, minutes: 0, hours: 0, days: 0, weeks: 0, months: 1, years: 0)
            break
            
        default:
            //If user want to share daily : Default
            date = date.addComponentsToDate(seconds: 0, minutes: 0, hours: 0, days: 1, weeks: 0, months: 0, years: 0)
            break
        }

        date = date.startOfDay
        defaults.set(date, forKey: defaultsKey)
        print(date.toString())
        
        completion(true)
    } else {
        completion(false)
    }
}

private func isRefreshRequired() -> Bool {
    guard let lastRefreshDate = defaults.object(forKey: defaultsKey) as? Date else {
        return true
    }
    
    if lastRefreshDate.isLaterThanOrEqualTo(date: Date()) {
        return true
    } else {
        return false
    }
}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50779564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档