我有一个应用程序,其中涉及数据同步部分, 目前我正在通过NSMutableURLRequest以XML的形式发送数据并通过initWithContentsOfURL接收。
但随着数据量的增加,同步时间也在增加。
如果有人知道如何以更好的方式实现这一点,或者对上述实现做出任何更改。这样可以缩短同步时间。
我想知道进行同步时要遵循的最佳方法/模式。
Currently I am Following This method..
<ROOT>
<ADD></ADD>
<UPDATE></UPDATE>
<DELETE></DELETE>
</ROOT>
我不是在询问如何连接..
在我的应用中,用户可以添加,更新和播放从iphone以及从服务器删除网站。 我想知道如何以适当的方式同步数据(Xml中的数据的正确结构)。所以数据用户可以在两边看到那里的条目。 提前谢谢......
答案 0 :(得分:2)
您可能需要查看AFNetworking。非常容易使用,它具有非常好的性能。您还可以使用内置的XML请求异步发送/接收XML数据,并根据需要处理它们。
如果您对如何做某些事情有任何疑问,请随时提出。
答案 1 :(得分:1)
//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];
答案 2 :(得分:1)
因为我没有得到正确答案我所期待的。我想我无法正确地提出我的问题。 让我指出我目前的实施情况。
1)用户从应用程序输入一些数据(这意味着每日计划的任务)。
2)网站提供相同的功能。
3)当用户从应用程序输入任何任务时,他可以在Portal上看到相同的任务(我做背景同步)。
4)用户可以从两侧添加,编辑,删除任务。
5)按照以下方式,我处理了Add,Edit&amp;删除任务。
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。
将所有任务放在Edit标签中,状态为=。
将所有任务放入Delete标签,状态为3。
现在在服务器端这个Xml是解析的,它根据标记插入,更新,删除。
在服务器端遵循上面提到的相同方法,然后添加 编辑删除xml已创建。 我解析app端的任务根据xml进行插入,更新和删除。
所以我的问题是如何改进这种类型的同步模型。 任何人都知道更好的同步模型,其中双方(网站和应用程序)用户可以添加,编辑和删除。
答案 3 :(得分:0)
“分而治之”规则可以为解决几乎所有问题提供理念:)
在这里,我将您的程序分为两个步骤
1.下载数据。
2.解析数据以供使用或可能是持久性存储。
现在,如果您可以同时执行这两项操作,则可以实现可能的速度。如果您将使用“异步”连接(即NSURLConnection
或任何第三方库),您可以执行这些操作。在- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
(即NSURLConnection的Delegate方法)中,您将收到一些数据块,因此异步解析它。通过这种方式,您只需将解析时间减少到几乎为零。对于异步解析,您可以使用libXml库。
以下是APPLE的示例代码。检查LibXml
的部分,它与我之前解释的相同。简而言之,我的解释是:Sample Code
您使用了“数据同步”字样,因此我没有包含与UI概念相关的任何内容。
<强>更新强>: 对于不知道如何与服务器同步的初学者。这是一系列精彩的教程:How to synchornize
答案 4 :(得分:0)
使用XML将大量数据传输到iOS设备有3个可能的问题点。首先,您拥有数据本身的大小。其次,一旦收到数据,您就有了处理时间。第三,你有连接的延迟(除非你控制两端,否则你几乎无能为力)。我会解决这三个问题,但要关注数据的大小,因为这似乎是你遇到的麻烦。
数据大小
如果您的问题是大型数据集,那么压缩就是您的朋友。我取得了巨大成功的一种方法是在内存中压缩数据,然后对此压缩数据进行base64编码,以便在传输时不会有奇数字符。我已经将它用于通用二进制数据以及特定的刚性数据格式。以下是相关代码段,您可以在使用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对你可能感兴趣的一些技术方面有一个很好的写作。