今天的 iOS 扩展目标成员资格是容器类还是用户默认值?

Posted

技术标签:

【中文标题】今天的 iOS 扩展目标成员资格是容器类还是用户默认值?【英文标题】:iOS today extension target membership of container classes or userdefaults? 【发布时间】:2018-03-22 16:27:35 【问题描述】:

我有一个 ios 应用,它也有一个今天的扩展。我正在尝试从主容器应用程序提供今天的扩展数据,但有很多用于保存数据的可解码模型类。

我的问题是:

    使用 userDefaults 从容器获取/设置数据是否更好 到扩展中或将今天的扩展目标包含在所有 模型类?

    tod​​ayExtension 目标中是否包含很多类 性能问题或电池消耗或类似问题?

谢谢。

*编辑 我的模型类的一个例子是:

class Alert : Codable 
var type : String?
var sequence : Int?
var status : String?
var issueTimeText : String?
var expiryTime : String?
var alertId : String?
var alertBannerText : String?
var alertHeaderText : String?
var bannerColour : String?
var zones : [String]?
// TEXT IS [STRING], STRING FOR TESTING
var text : String?
var tcisURL : String?

enum CodingKeys: String, CodingKey 
    case type = "type";
    case sequence = "sequence";
    case status = "status";
    case issueTimeText = "issueTimeText";
    case expiryTime = "expiryTime";
    case alertId = "alertId";
    case alertBannerText = "alertBannerText";
    case alertHeaderText = "alertHeaderText";
    case bannerColour = "bannerColour";
    case text = "text";
    case zones = "zones";
    case tcisURL = "tcisURL";


init(inType: String, inIssueTimeText:String, inBannerText:String, inText: String, inColor: String) 
    self.type = inType
    self.issueTimeText = inIssueTimeText
    self.alertBannerText = inBannerText
    self.text = inText;
    self.bannerColour = inColor

【问题讨论】:

你存储什么样的数据?有多少?您能否发布您所指的数据模型示例? " 在所有模型类中包含今天的扩展目标?"这意味着什么?您不能在类中包含目标。我认为您在混淆术语或混淆概念。在扩展中包含内容时,您需要注意两件事:1)与应用程序相比,可用内存有限 2)并非所有可以包含在应用程序中的框架/标头等都可以包含在扩展程序中. @Gruntcakes 我的意思是每个模型类,包括 todayExtension 作为目标成员的一部分(即指示哪个类对哪个目标“可见”的复选框)。无论如何感谢您的帮助。 @Jake 请查看编辑。它们都是符合 Codable 的简单结构体 目标是向设备保存警报历史记录吗? 【参考方案1】:

这完全取决于您希望数据如何进入今天的扩展程序。是的,我发现用户默认值是最好的。您必须在应用程序和今天的扩展程序中创建应用程序组。用户默认如何使用今天的扩展。因此,当您想将数据保存到用户默认值(通过按钮或更新计时器)时,您将需要此代码 UserDefaults.init(suiteName: "group.com.bundleID.appName")?.setValue(textfield.text, forKey: "name")

这就是它的保存方式。在viewDidAppear(_ animated: Bool) 下的今日扩展中,您需要检索数据并将其放在标签上,因此请编写此代码。 if let name = UserDefaults.init(suiteName: "group.com.bundleID.appName")?.value(forKey: "name") label.text = name as? String 它应该工作。我在 YouTube 上也有关于这个确切教程的视频。 https://www.youtube.com/watch?v=skbWSQlcN5k

希望这会有所帮助,内森

【讨论】:

感谢您的回复和建议。这就是我目前的做法,但只是想知道将一堆模型类作为今天扩展的目标成员是否是个坏主意。【参考方案2】:

我假设您想将警报历史记录保存到设备。

您不想为此使用UserDefaults

如果我的假设是正确的,您最好使用 Core Data 将数据存储到您的设备并检索它以供以后使用。核心数据是一种资源,可让您将数据存储到您的设备和数据库中(如果您愿意)。这里有太多要讨论的内容,但 Ray Wenderlich 有一个很棒的博客,可以引导您完成这个和许多其他事情。

【讨论】:

以上是关于今天的 iOS 扩展目标成员资格是容器类还是用户默认值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从应用程序显示到Today Extension Swift

如何让 Mypy 在 Callable 中识别类的协议成员资格?

oAuth ASP.NET 成员资格提供程序

如何使用 nsobject 类共享数据(在 watch OS 2 中)

无法将 xib 文件添加到目标成员资格

php 从BuddyPress组中删除用户,其中用户是特定m2p成员资格的成员或没有成员资格