我的iOS应用程序有一个非常常见的设置:它向使用JSON对象响应的API服务器进行HTTP查询.然后将这些JSON对象解析为适当的Swift对象.
最初,我将属性划分为必需的属性和可选属性,主要基于我的API服务器的数据库要求.例如id,email和name如此他们使用非可选类型需要的字段.其他人可以NULL在数据库中,因此它们是可选类型.
class User {
let id: Int
let email: String
let profile: String?
let name: String
let motive: String?
let address: String?
let profilePhotoUrl: String?
}
Run Code Online (Sandbox Code Playgroud)
最近,我开始怀疑这是否是一个很好的设置.我发现尽管某些属性可能总是在数据库中,但这并不意味着这些属性将始终包含在JSON响应中.
例如,在"用户配置文件"页面中,需要所有这些字段才能正确显示视图.因此,JSON响应将包括所有这些字段.但是,对于列出用户名称的视图,我不需要email或者id,JSON响应也可能不包括这些属性.不幸的是,这将导致错误和解析JSON响应到斯威夫特对象时,因为应用程序崩溃预计的应用id,email,name是永远不会比零.
我正在考虑将Swift对象的所有属性更改为可选对象,但感觉就像丢掉了这种特定于语言的功能的所有好处.此外,我将不得不编写更多代码行来打开应用程序中其他地方的所有这些选项.
另一方面,JSON对象本质上不能与Swift的严格静态类型和nil检查非常互操作,所以最好简单地接受这种烦恼.
我应该过渡到每个属性作为选项的模型吗?或者,还有更好的方法?我很感激这里有任何评论.
我正在移动客户端上构建一个即时通讯工具,它通过 HTTP 请求与 RESTful API 进行交互。分页端点非常标准 - 它具有起始位置(偏移量)和页面中的项目数(限制)。当数据库可以快速更改时,我无法弄清楚如何确保 100% 数据与分页的一致性。
例如,如果有几十个参与者,在一秒钟内对话中可能会有十几条新消息。我认为猜测其中一些消息可以在 HTTP 分页请求从服务器返回的时间内更改数据库并不牵强。幸运的是,由于这是一个信使我不必考虑数据删除的可能性,只考虑数据添加。
在我的研究中,以下两个链接很有帮助,但没有提供明确的解决方案:
当结果集可能发生变化时,如何使用 RESTful API 实现健壮的分页?
我能想出的唯一潜在解决方案是使用先前获取的页面中最后一个对象的时间戳。因此,HTTP 查询将时间戳作为参数,服务器将返回在该时间戳之后创建的对象页面。
有没有我没有看到的潜在问题,或者甚至更好,这个问题的更好解决方案?
这String#dasherize来自ActiveSupport::Inflector:
def dasherize(underscored_word)
underscored_word.tr('_', '-')
end
Run Code Online (Sandbox Code Playgroud)
它用短划线替换字符串中的下划线.
'puni_puni'.dasherize # => "puni-puni"
Run Code Online (Sandbox Code Playgroud)
接收器用作该方法的唯一参数.
ActiveSupport::Inflector.dasherize(puni_puni) # => "puni-puni"
Run Code Online (Sandbox Code Playgroud)
当我尝试做类似的事情时,它不起作用:
module NewDash
def new_dasherize(underscored_word)
underscored_word.tr('_', '-')
end
end
String.include NewDash
t = "t_e_s_t"
t.new_dasherize # => ArgumentError: wrong number of arguments (0 for 1)
t.new_dasherize(t) # => "t-e-s-t"
Run Code Online (Sandbox Code Playgroud)
我该如何复制这种行为,它的技术术语是什么?