2015-10-03 98 views
0

我在“引用一天”项目中有500个引号的Swift数据文件,并且每当它成为新的一天时,我都想致电updateQuote()创建一个每24小时运行一次的事件?

引用字符串变量更新QuoteViewcontroller中的UILabel以及UILocalNotifiication()中的alertBody字符串。

请参阅以下参考:

var quotes:[Quote] = quoteData 
var quote: String! 
var counter = 0 


func updateQuote() { 

    if counter == quotes.count { 

     counter = 0 

    } else { 

     quote = quotes[counter].quoteTitle 

     counter++ 
    } 
} 

我试图做这样的事情与NSDate()

let userCalendar = NSCalendar.currentCalendar() 
let dayCalendarUnit: NSCalendarUnit = [.Day] 
let DayDifference = userCalendar.components(
    dayCalendarUnit, 
    fromDate: lastDate, 
    toDate: nowDate, 
    options: []) 

var difference = DayDifference.day 

if difference > 0 { 

updateQuote() 
lastDate = nowDate 
} 

但是,这一逻辑似乎并不因为我不知道如何填写工作在最初的运行中是lastDate和nowDate。

我也不知道在哪里把上述功能,以便它可以继续检查,而应用程序在后台运行。

任何见识都会很棒。

+0

没有地方让你放置该功能,因此它将“保持在后台运行”。这会杀死电池寿命,所以苹果不允许它。 –

+0

如果用户点击它,本地通知只会调用您的代码。如果他们不这样做,它会继续提供相同的文本。 OP在这里实际上有几个问题; 1.如何处理初始日期比较? (微不足道的,只是检查零),但更重要的是2.如何保持,检查在后台?这是不可能的。我看到过很多类似的问题。一些可能的解决方案是1.推送通知。 2.后台提取3.一次连续安排多个本地通知,并在应用启动时更新这些通知。 3可能是最好的,如果你有没有服务器 – Paulw11

+0

亚历克西斯,你什么时候要显示新的报价,应用程序内的时候,用户打开或本地通知?如果是后者,那么你会想使用scheduleLocalNotification(_ notification:UILocalNotification)。 – Daniel

回答

0

如果您只是希望应用每天在UILabel中显示不同的报价,那么显而易见的解决方案就是将今天的日期转换为整数,然后使用该整数将其索引到您的数组中。像这样的东西会做...

let daysSince1970 = NSDate().timeIntervalSince1970/60/60/24 
let index = Int(daysSince1970) % quotes.count 
myLabel.text = quotes[index] 

上面的代码不必不断地运行,它只有当应用程序移动到前台运行。

要在通知中放置当天的报价......在您的用户界面的某个位置,您应该询问用户他们想要报价的时间。一旦你有了这些时间,加载几个一次性通知,每个通知都有不同的报价,并设置为在不同的日期交付(选择报价时使用与上述相同的算法,除了每天提前索引一次)。我认为Apple允许您以这种方式加载64个通知。

+0

太棒了 - 非常感谢,丹尼尔。我将尝试以上看看它是否会起作用。如果用户在当天的任何时间打开应用程序,都希望显示每日报价标签,这是对的。此外,根据用户输入的时间设置,在当地通知中提供当天的报价。 –

相关问题