【问题标题】:Optimize loading of remote plist优化远程 plist 的加载
【发布时间】:2011-06-28 07:48:59
【问题描述】:

我编写了一个应用程序,它从位于我的服务器上的 plist 中加载信息(我希望 Apple 可以这样做:-))。该应用程序在 WiFi 上运行流畅,但在 3G 上使用时加载时间有点太长。因此,我想优化我的 plist 的加载。

我想我可以在设备上存储 plist 的副本,并且只检查远程 plist 是否已更改,如果是,请下载它。我不确定这是否会减少数据,从而最大限度地减少加载时间,我什至不确定这将如何用代码编写。

有谁知道如何最大限度地减少加载时间并可能发布代码示例?

现在我正在使用这两行来加载 plist 并存储它。 FETCH_URL 显然是我的网址。

NSURL *url = [NSURL URLWithString:FETCH_URL];
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithContentsOfURL:url];

编辑:我正在尝试按照 Thomas Clayson 的建议使用 NSURLConnection,但我似乎无法弄清楚如何将数据转换为 NSMutableArray。

这是在我看来DidLoad:

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:FETCH_URL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection) {
        NSLog(@"Connection open.");
    }
    else {
        NSLog(@"Failed connecting.");
    }

然后我有这两种方法来检查是否有任何新数据,并检查是否所有数据都已收集。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"More data.");
    [receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"Connection successful.");
}   

【问题讨论】:

  • 是加载时间问题还是在您加载时应用程序挂起?

标签: iphone load plist minimize


【解决方案1】:

您只能通过最小化 plist 本身来最小化加载时间。尝试各种格式(二进制 plist、xml plist)。如果您有选择 - 尝试获取 json。 AFAIK 它具有最佳的信息大小比。二进制 plist 解析速度最快,而 xml plist 最适合调试目的。

【讨论】:

  • 10mb json feed 仍然是 10mb json feed...这只会帮助减少文件的大小,而不是加载时间。
  • 文件越小意味着加载时间越短。没有?
  • 是的 - 但是当数据集大小增加时会发生什么?
【解决方案2】:

我明白你的意思。您将需要使用 NSURLConnnection 而不是 initWithContentsOfURL

initWithContentsOfURL 是同步的。这意味着它将在主线程上运行并因此“挂起”应用程序(这是因为 UI 事件必须在主线程上发生,并且如果正在发生进程(等待 plist 下载)应用程序将“停止” )。

无论如何 - 如果您使用 NSURLConnection 那么您将能够异步执行它(在另一个线程上)。这意味着您的应用程序将在一段时间内可用,但不会立即显示 plist 中的数据。所以你需要在connectionDidFinishLoading:时处理视图来刷新数据。

无论如何都要查一下。 :) 它非常有用

【讨论】:

  • 这听起来很不错。我曾尝试在 Apple 的文档中阅读它。我想我几乎已经让它工作了,但我似乎不知道如何将数据转换或添加到NSMutableArray。我已经编辑了我的原始帖子以显示我的代码。你能帮我把数据转换成一个 NSMutableArray 以便我以后提取它吗?
  • @SimonBS 当你开始连接时,你应该创建一个 NSMutableData 对象来缓冲数据。在connection:didReceiveData: 中,您可以将数据附加到该缓冲区。最后,在connectionDidFinishLoading: 中,您将调用+[NSPropertyListSerialization propertyListWithData:options:format:error:](或4.0 之前的iOS 的propertyListFromData:... 变体)将数据转换为属性列表类型(即NSArray)。
  • 会是这样吗? NSArray *testArray = [NSPropertyListSerialization propertyListWithData:receivedData options:NSPropertyListMutableContainers format:NULL error:NULL]; 它似乎不起作用。好像receivedData 是NULL 但我确实使用[receivedData appendData:data];in didReceiveData
  • receivedData 是 NSMutableData 类型吗?
  • 是的,它在我的标题中声明。 NSMutableData *receivedData;@property (nonatomic, retain) NSMutableData *receivedData;
猜你喜欢
  • 2016-06-14
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
相关资源
最近更新 更多