本题的目的是获得有关算法的提示。我认为,无论语言如何,事件生成的实现都或多或少相同,但通知的显示将取决于平台。在这件事上,我们不会进入这样的丛林,但是,为了举一些例子,让我们考虑一下像“Microsoft To Do”这样的常规任务管理器。
此类应用程序工作的主要实体是任务(task)。准备了一个简单的C#类Task
:
public class Task
{
public required string ID { get; init; }
public required string Title { get; set; }
public string? Description { get; set; }
public bool IsComplete { get; set; } = false;
}
我不认为创建一个单独的实体有任何意义Notification
,因为任何事物Notification
只有与特定任务相关时才有意义,并且该实体除了时间之外不会有任何字段。尽管在“Microsoft 待办事项”列表中,您只能为每个任务设置一个警报,但在 Google 日历事件中,您可以指定多个警报,因此我将执行相同的操作:
public class Task
{
public required string ID { get; init; }
public required string Title { get; set; }
public string? Description { get; set; }
public bool IsComplete { get; set; } = false;
// Новое
public List<DateTime> Notifications { get; set; } = [];
}
现在有必要创建一个事件生成算法,根据该算法,在正确的时间就可以知道应该立即提醒用户哪个任务。
最简单(但也是愚蠢)的解决方案如下:
- 创建一个周期为 1 分钟的重复计时器
- 每分钟从按时间筛选的数据源(例如数据库)中抓取所有任务。更详细地说,您需要找到那些具有
Notifications
与当前分钟相对应的数组元素的任务。(如何在数据库中实现数组的存储是单独讨论的)。 - 为每个提醒调用事件处理程序
我想从性能的角度来看,每分钟爬行整个数据库是一个坏主意,并且字段Notifications
不能成为索引以加快搜索速度。我认为用于本机开发的编程语言应该为此类任务提供某种 API。同样重要的是,应用程序可以在后台工作时显示警报。
虽然这个问题是关于算法的,而不是关于在特定编程语言和特定库中的实现,但是如果你对我的技术栈感兴趣,那么它就是 C#、.NET MAUI 和 Blazor。由于开发是同时针对多个平台(Android、iOS、macOS、Windows、Tizen)进行的,因此一些具有现成解决方案的 Andorid 库不足以解决此问题;您可能必须自己实施一切。
需要一种功能
getNextNofitication
。您不需要每分钟运行一次,而是仅在以下情况下运行:每次发生其中一种情况时,我们都会设置一个计时器(使用依赖于平台的方式)并等待它触发。当计时器触发时,我们会显示一条通知并再次调用它
getNextNotification
以设置下次触发时的计时器。它很容易实现
getNextNotification
。Task
如果和之间的连接Nofication
存储在单独的表中,那么我们只需按时间查找第一个记录(在这种情况下索引工作正常)。如果我们将非规范化的响应时间存储在 中
Task.Notifications
,那么我们将其添加到Task
另一个字段中NextNotificationTime
,并在保存时Task
设置该字段min(Notifications)
。再说一遍,搜索是最小的getNextNotification
搜索(在这里,索引也可以很好地工作)。Task
NextNotificationTime