1

我编写了一个应用程序,它从位于我的服务器上的 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。

这是在我的 viewDidLoad 中:

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.");
}   
4

2 回答 2

1

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

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

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

反正查一下。:) 它非常有用

于 2011-02-16T12:46:20.547 回答
0

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

于 2011-02-16T12:15:05.130 回答