我编写了一个应用程序,它从我的服务器上的plist中加载信息(我希望Apple可以这样做:-))。该应用程序在WiFi上运行顺畅,但在3G上使用它时,加载时间有点太长。因此,我想优化我的plist的加载。
我想我可以在设备上存储plist的副本,只检查远程plist是否已更改,如果是,请下载它。我不确定这是否会减少数据量,从而最大限度地减少加载时间,我甚至不确定如何在代码中编写这些内容。
有没有人知道如何最小化加载时间并可能发布代码示例?
现在我正在使用这两行加载plist并存储它。 FETCH_URL
显然是我的网址。
NSURL *url = [NSURL URLWithString:FETCH_URL];
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithContentsOfURL:url];
编辑:我正在尝试使用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.");
}
答案 0 :(得分:1)
我明白你的意思。您将需要使用NSURLConnnection而不是initWithContentsOfURL
。
initWithContentsOfURL是同步的。这意味着它将在主线程上运行,从而“挂起”应用程序(这是因为UI事件必须在主线程上发生,如果进程正在发生(等待plist下载),应用程序将“停止” )。
无论如何 - 如果您使用NSURLConnection,那么您将能够异步(在另一个线程上)。这意味着您的应用程序暂时可用,但不会立即显示plist中的数据。因此,您需要处理视图以在connectionDidFinishLoading:
。
无论如何要查找它。 :)非常有用
答案 1 :(得分:0)
您只能通过最小化plist本身来最小化加载时间。尝试各种格式(二进制plist,xml plist)。如果你有一个选项 - 尝试获取json。 AFAIK具有最佳的信息量比。二进制plist解析速度最快,xml plist最适合调试目的。