- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我必须创建一个功能类似于联系人应用程序的应用程序。您可以在客户的 iPhone 上添加一个联系人,它应该会上传到客户的 iPad 上。如果客户在他们的 iPad 上更新联系人,它应该会在他们的 iPhone 上更新。
其中大部分是相当直接的。我正在使用 Parse.com
作为我的后端并使用 Core Data
在本地保存联系人.我遇到的唯一问题是在用户离线时管理联系人。
假设我有一部 iPhone 和一部 iPad。他们两个目前拥有相同版本的在线数据库。我的 iPhone 现在处于离线状态。现在是上午 9 点。
上午 10 点,我在 iPad 上更新联系人的电话号码。它在本地和在线保存更改。上午 11 点,我在 iPhone 上更新了同一联系人的电子邮件地址,但我仍然处于离线状态。
中午,我的 iPhone 连接到互联网并检查服务器是否有变化。它看到它的更改比最新更新更新(检查 updatedAt
时间戳属性),因此它不会下载联系人的新电话号码(“已过时”),而是覆盖电话号码和电子邮件地址(将新电话号码更新为旧版本,因为它在上午 10 点更新电话号码期间处于离线状态,并且其更改据说是最近的)。
我应该如何管理遇到的在线/离线问题,例如上述问题?我能想到的一个解决方案是为联系人的每个属性保留更新的时间戳,而不仅仅是一般的 updatedAt
整个联系人的属性,例如什么时候更新名字,什么时候更新姓氏,然后手动检查离线设备是否对每个属性都有最近的更改,而不是覆盖整个对象,但这似乎很草率。
我也想拥有一个 updatedLocally
和 updatedOnline
每个 Core Data
上的时间戳属性目的。这样,如果两者不匹配,我可以进行差异检查并使用最新的来解决冲突,但这似乎仍然不是最干净的解决方案。有没有其他人遇到过类似的事情?如果是这样,你是如何解决的?
我的想法的伪代码/摘要?涵盖了每个测试用例,但仍然不是很优雅/完整:
Parse.com 上的 2 个实体:联系方式和联系历史
联系人有第一个、最后一个、电话、电子邮件、在线更新
联系人历史记录有一个联系人的主键来引用,并且具有相同的属性但具有历史记录。例如first: [{value:"josue",onlineUpdate:"9AM"},{value:"j",onlineUpdate:"10AM"},{value:"JOSUEESP",onlineUpdate:"11AM"}]
1 核心数据实体,联系人:
联系人有第一个、最后一个电话、电子邮件、onlineUpdate 和 offlineUpdate(重要:这仅在 Core Data 上,不在 Parse 上)
for every contact in parse database as onlineContact {
if onlineContact does not exist in core data {
create contact in core data
}
else {
// found matching local object to online object, check for changes
var localContact = core data contact with same UID as onlineContact
if localContact.offlineUpdate more recent than onlineContact.onlineUpdate {
for every attribute in localContact as attribute {
var lastOnlineValueReceived = Parse database Contact History at the time localContact.onlineUpdate for attribute
if lastOnlineValueReceived == localContact.attribute {
// this attribute did not change in the offline update. use latest available online value
localContact.attribute = onlineContact.attribute
}
else{
// this attribute changed during the more recent offline update, update it online
onlineContact.attribute = localContact.attribute
}
}
}
else if onlineContact.onlineUpdate more recent than localContact.offlineUpdate {
// another device updated the contact. use the online contact.
localContact = offlineContact
}
else{
// when a device is connected to the internet, and it saves a contact
// the offline/online update times are the same
// therefore contacts should be equivalent in this else statement
// do nothing
}
}
最佳答案
我建议使用基于 key 的更新而不是基于联系人的更新。
您不应该将整个联系人发送到服务器,在大多数情况下,用户只会更改一些属性(例如“姓氏”通常不会经常更改)。这也减少了带宽使用。
随着离线联系人的应用更改,您发送
您的本地联系人到服务器的旧版本号/上次更新时间戳。服务器现在可以
只需查看您的旧版本号,即可确定您的本地数据是否是最新的。如果您的旧版本号与服务器的当前版本号匹配,则您的客户端无需更新任何其他信息。如果不是这种情况,服务器应向您发送新联系人(在应用您请求的更新后)。
您还可以保存这些提交,这将导致联系历史记录
每次更改 key 时,它不会存储整个联系人,而只会存储更改本身。
一个简单的伪代码实现可能如下所示:
for( each currentContact in offlineContacts ) do
{
if( localChanges.length > 0){ // updates to be made
commitAllChanges();
answer = getServerAnswer();
if(answer.containsContact() == true){
// server sent us a contact as answer so
// we should overwrite the contact
currentContact = answer.contact;
} else {
// the server does not want us to overwrite the contact, so we are up to date!
}
// ...
}
} // end of iterating over contacts
for (currentContactToUpdate in contactsToUpdate) do
{
sendBackContact = false; // only send back the updated contact if the client missed updates
for( each currentUpdate in incomingUpdates ) do {
oldClientVersion = currentUpdate.oldversion;
oldServerVersion = currentContact.getVersion();
if( oldClientVersion != oldServerVersion ){
sendBackContact = true;
// the client missed some updates from other devices
// because he tries to update an old version
}
currentContactToUpdate.apply(currentUpdate);
}
if(sendBackContact == true){
sendBack(currentUpdate);
}
}
_ Server iPhone iPad
ID 42 42 42
Ver 1 1 1
First Foo Foo Foo
Last Bar Bar Bar
Mail f@b f@b f@b
UPDATE 42 FROM 1 TO 2 Mail=foo@b
// ^ID ^old version ^new version ^changed attribute(s)
_ iPhone
ID 42
Ver 2
First Foo
Last Bar
Mail foo@b
UPDATE 42 FROM 1 TO 2 First=Voo
_ Server iPad
ID 42 42
Ver 1 2
First Foo Voo
Last Bar Bar
Mail f@b f@b
UPDATE 42 FROM 1 TO 2 First=Voo
UPDATED 42 FROM 1 TO 2 - OK
_ Server iPad
ID 42 42
Ver 2 2
First Voo Voo
Last Bar Bar
Mail f@b f@b
_ Server iPhone
ID 42 42
Ver 2 2
First Voo Voo
Last Bar Bar
Mail f@b foo@b
UPDATE 42 FROM 1 TO 2 Mail=foo@b
_ Server iPhone
ID 42 42
Ver 2 2
First Voo Voo
Last Bar Bar
Mail foo@b foo@b
UPDATED 42 FROM 1 TO 3 - Ver=2;First=Voo;.... // send the whole contact
/* Note how the version number was changed to 3, and not to 2, as requested.
* If the new version number was (still) 2 the iPad would miss the update
*/
关于ios - 在线/离线数据管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31102357/
我有一个 PowerBI Online 数据集,它是在 PowerBI 桌面中创建然后在线发布的。到目前为止,一切都很好。 我通过 PowerBI pusblish 从 Excel 连接到数据集,按预
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我必须对一些太大而无法放入内存的数据训练分类模型,我正在使用 scikit learn 和 pandas 来进行分析。所以这是我的问题,如何在在线学习管道中使用验证来调整超参数? 我使用带有chuck
我正在开发一个应用程序,该应用程序将从 webservice 获取数据和图像并将其存储在设备中以供离线使用。同时,应用程序会将一些数据存储在 sqlite db 中,并将一些图像作为默认数据。 这是应
是否可以使用 FileReader API 和 onprogress 事件访问随 HTML5 传入的数据? 如果是这样,是否有 MD5 或其他快速散列算法的“在线”版本,以便我可以在文件完全读取之前开
希望任何人都可以帮助我更改下面的代码,我的临时文件包含以下代码: Temp=8.4* Humidity=70.4% 代替代码 Temp = 24 *C, Hum = 40 % 适用于以下脚本。 我需
我必须创建一个功能类似于联系人应用程序的应用程序。您可以在客户的 iPhone 上添加一个联系人,它应该会上传到客户的 iPad 上。如果客户在他们的 iPad 上更新联系人,它应该会在他们的 iPh
在 gitlab.com 上审查 merge 请求时,有时我必须在完成 merge 之前进行 rebase。 在 gitlab 上按“Rebase”后,我有一个特定的管道步骤失败,因为它无法验证用户的
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我正在尝试在 azure 上托管 SQL 服务器以与节点应用程序进行通信。我已经成功地完成了创建数据库服务器和数据库本身的过程。现在,我想编辑我的数据库结构。据我发现online ,应该有一种方法可以
我在 Quickbooks Intuit 开发人员 API 中使用 Oauth 2 获得了访问 token 。 范围是 com.intuit.quickbooks.accounting 我能够使用 Q
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
是否可以使Angular Material progress spinner与文本并大致与字符的大小一致地显示? 我想要类似的东西: please wait 微调器仅与“请稍候”文本成行出现。 这可
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个每天运行的Powershell脚本。今天它失败了,因为我正在使用的域 Controller 不可用。在继续执行脚本的其余部分之前,我想确保可以连接到可用的DC。 $LdapServer = "
我想制作一款在线 Flash 游戏,它将具有社交功能,但游戏玩法将主要是单人游戏。例如,屏幕上不会同时出现两个玩家,社交互动将通过异步消息进行,不会有实时聊天或其他任何内容。大部分逻辑将发生在客户端中
这几天我开始在线玩OpenShift。我部署了一个非常简单的“Hello World”Java 示例(1 行代码!),没有任何依赖项(没有 Spring!)命令行是这样的: oc.exe new-a
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
所以我一直在网上学习Java(初学者),并且我一直在尝试制作一个用于制作矩形的类文件。但是,我的在线 java 评估器指出它找不到实例变量。 This is the comment on it.我的代
我是一名优秀的程序员,十分优秀!