进行移动和服务器同步的最佳方式是啥?

Posted

技术标签:

【中文标题】进行移动和服务器同步的最佳方式是啥?【英文标题】:What is the Best Way to do Mobile & Server Sync?进行移动和服务器同步的最佳方式是什么? 【发布时间】:2012-04-06 18:12:02 【问题描述】:

我有一个应用程序涉及数据同步部分, 目前我正在通过 NSMutableURLRequest 以 XML 的形式发送数据并通过 initWithContentsOfURL 接收数据。

但随着数据量越来越大,同步时间也在增加。

如果有人知道如何以更好的方式实现这一点,或者对上述实现进行任何更改。这样同步时间就减少了。

我想知道进行同步的最佳方法/模型。

Currently I am Following This method..
<ROOT>
<ADD></ADD>
<UPDATE></UPDATE>
<DELETE></DELETE>
</ROOT>

我不是在问如何建立连接..

在我的应用程序中,用户可以从 iphone 以及服务器手段网站添加、更新和删除。 我想知道如何以正确的方式同步数据(Xml 中的正确数据结构)。因此数据用户可以在两侧看到条目。 提前谢谢...

【问题讨论】:

【参考方案1】:

您可能想查看AFNetworking。非常易于使用,并且具有非常好的性能。您还可以使用内置的 XML 请求来异步发送/接收 XML 数据并随意处理它们。

如果您对如何做某些事情有任何疑问,请随时提出。

【讨论】:

您是否与 AFNetworking 有任何关联?另外,您知道 OP 本身并没有要求图书馆推荐,对吧? 不,我不隶属于 AFNetworking,我只是想到了它,我只是想我把它扔在这里以防他感兴趣。没必要为此生气。如果对你有影响,我可以删除答案【参考方案2】:
//Better and effective to use the asynchronous request to the server that will cost less time and even your UI will be remained active

NSLog(@"Server Path:%@",dataUrl);
//connection
NSURLConnection *theConnection;
NSMutableURLRequest *Request = [NSMutableURLRequest requestWithURL:dataUrl cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0]; 
[Request setHTTPMethod:methodName]; 
theConnection = [[NSURLConnection alloc] initWithRequest:Request delegate:self];

【讨论】:

是的,我使用相同的方式向服务器请求 @kuldeep:“这将花费更少的时间”是什么意思?您的意思是异步比同步服务调用更快吗?使用异步调用的好处是 UI 保持活跃并提供更好的用户体验。在同步调用 UI 中只是挂起,直到您收到数据。【参考方案3】:

因为我没有得到我所期望的正确答案。我想我无法正确提出我的问题。 让我指定我当前的实现。

1)用户从应用中输入一些数据(这里是指任务的每日计划)。

2) 网站提供相同的功能。

3)当用户从应用程序输入任何任务时,他可以在门户上看到相同的任务(我进行后台同步)。

4)用户可以从双方添加、编辑、删除任务。

5)我按照以下方式处理了添加、编辑和删除任务。

I have Status Column in the table.  

 Status = 0 means task is sync on both side.
 Status = 1 means newly added task
 Status = 3 means user deleted the task which was on server.

   a)when user add any task I insert that task with Status = 1.
    When I sync the task I extract all the task with status = 1.
   Put the task in ADD tag.

   b)On server side task is added in the database and it again send back to app with unique primary id. (needed when user edit any task.) I insert that task to my table with status = 0.

   c)Now when user edit any task I first check the status of task, if its Status = 1,I keep the status as 1. but status is 0 i changed that status = 2.

   d)If user delete any task I check the status if its status = 1 I delete that task, if its 0 or 2 I changes its status to 3.

  Now when Sync Method is Called, I search through Table 

将所有任务放在状态为 1 的添加标签中。

将所有任务放入状态为 2 的 Edit 标记中。

将所有任务放入状态为 3 的 Delete 标记中。

现在在服务器端这个 Xml 被解析并根据标签插入、更新、删除。

在服务器端遵循我上面提到的相同方法,并添加 编辑删除 xml 已创建。 我在app端解析任务,根据xml进行插入、更新和删除。

所以我的问题是如何改进这种类型的同步模型。 任何人都知道更好的同步模型,双方(网站和应用程序)用户都可以添加、编辑、删除。

【讨论】:

【参考方案4】:

使用 XML 将大量数据传输到 ios 设备时可能存在 3 个问题。首先你有数据本身的大小。其次,一旦收到数据,您就有处理时间。第三,你有连接的延迟(除非你控制两端,否则你几乎无能为力)。我将解决所有这三个问题,但要关注数据的大小,因为这似乎是您遇到的问题。

数据大小

如果大型数据集是您的问题,那么压缩就是您的朋友。我取得了巨大成功的一种方法是将数据压缩到内存中,然后对压缩后的数据进行 base64 编码,这样在传输中就不会出现奇数字符。我已经将它与通用二进制数据以及特定的刚性数据格式一起使用。这是相关的sn-p,你可以看到这个方法,因为它使用了for packaging the data here:

NSString* encodedStr = nil;
NSData *bufferData = [dict objectForKey:@"someKey"];
if (bufferData)

    data = [LFCGzipUtility gzipData:bufferData];
    len = [data length];
    char* byteData2 = (char*)malloc(len);
    memcpy(byteData2, [data bytes], len);
    encodedStr = base64_encode(byteData2, len);
    free(byteData2);
           

您可以反转该过程以取回数据。这几乎可以用于任何数据类型,而不仅仅是 XML,尽管您获得的压缩优势越多,这对您的帮助就越大。文本压缩得很好——它非常适合 XML。

此外,您还可以更改数据格式。在多次使用 XML 之后,我转向了 json,因为它通常更紧凑且更易于使用。 XML 擅长通用解决方案,但如果您不需要严格通用的东西,它可能是矫枉过正。我最喜欢的技术笑话:XML 就像暴力。如果它不能解决您的问题,那么您使用的不够多。 =) 另外Apple 和3rd parties 在iOS 上对json 有很好的支持。

最后,对于数据本身,请确保您不会一遍又一遍地发送不必要的数据。设备缓存是您的朋友。尽可能将数据分解为可重复使用的部分。我知道这并不总是可行的,但它绝对可以对大型数据集产生影响。

处理时间

确保您使用工具来分析您的呼叫,并且确保实际数据传输是您获取数据后不处理数据的问题。 NSXMLParser 乍一看可能有点难以理解,但它的工作效率非常高,而且速度非常快,而且还能很好地利用你的记忆力。 此外,一遍又一遍地发送不需要的数据,或者通过许多小操作而不是大量读取或写入将数据存储在磁盘上可能会导致性能问题。

延迟

通常你无法控制这个因素,但如果这是一个问题,那么你可以限制重复网络调用的数量,并在更少的网络调用中加载更多的数据。

最后,this link 写了一篇关于您可能感兴趣的更多技术方面的文章。

【讨论】:

【参考方案5】:

“分而治之”规则可以为解决几乎所有问题提供思路:)

在这里,我将您的程序分为两个步骤。 1. 下载数据。 2.解析数据以供使用或可能是持久性存储。

现在,如果您可以并行执行这两项操作,您就可以达到可能的速度。如果您将使用“异步”连接(即NSURLConnection 或任何第三方库),则可以执行这些操作。在- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data(即 NSURLConnection 的委托方法)中,您将收到一些数据块,因此异步解析它。通过这种方式,您只能将解析时间减少到几乎为零。对于异步解析,您可以使用 libXml 库。

这是一个 APPLE 的示例代码。检查LibXmlit 的部分是否与我之前解释的相同。总之实用我的解释:Sample Code

你使用了“数据同步”这个词,所以我没有包含任何与 UI 概念相关的内容。

更新: 对于不知道如何与服务器同步的初学者。这是一系列很棒的教程:How to synchornize

【讨论】:

以上是关于进行移动和服务器同步的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在线程之间传递信息的最佳方式是啥?

将手机位置从移动应用程序发送到服务器的最佳方式是啥?

在移动应用程序中持续从服务器获取更新的最佳方式是啥?

在两个应用程序之间进行通信的最佳和最快方式是啥?

对 Web 服务进行身份验证的最佳方式是啥

在 django 中与应用程序服务器/网络服务器进行通信的最佳方式是啥[关闭]