我写了一个简单的 Mac OS 应用程序。该 View 仅包含一个隐藏的 WebView 和一个 NSTextView。在某个时间会解析 100 个 URL,一个接一个。一个 URL 被加载到 WebView 中,一些 DOM 树解析发生,冲洗并重复。
除了计算机空闲(无用户事件)时的加载时间存在一些重大差异外,一切正常。当我使用计算机时,加载 URL 大约需要 2 秒。当我有一段时间不使用计算机时,加载 URL 大约需要 1 分钟。
当我在一段时间后回到计算机并在 TextView 中看到最后一个 URL 花费了大约一分钟时,下一个将在几秒钟内立即加载。所以它必须与系统上的用户事件有关。正确的?有人知道为什么吗?
我使用的是 OS X 10.9.4。
这是我加载 URL 的代码:
#pragma mark -
- (void)processNextUrl
{
// No url, stop
if (_processQueue.count == 0)
return;
// Process url
NSString *urlString = [_processQueue objectAtIndex:0];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[[_webView mainFrame] loadRequest:request];
}
#pragma mark - WebFrameLoadDelegate
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
// Page ready for parsing?
if ([[sender mainFrame] isEqual:frame] == NO)
return;
// Append date, time and url to TextView
NSString *url = [[[[frame dataSource] request] URL] absoluteString];
[self logText:url];
// Parser does some DOM parsing and outputs to TextView
Parser *parser = [[Parser alloc] initWithWebFrame:frame delegate:self];
[parser parse];
}
#pragma mark - ParserDelegate Methods
- (void)parser:(Parser *)parser didFinishParsingUrl:(NSString *)url
{
[_processQueue removeObjectAtIndex:0];
[self processNextUrl];
}
最佳答案
我敢打赌AppNap正在启动并耗尽您的资源进程。
您可能想在您的应用程序的 Finder 的获取信息窗口中禁用 AppNap - 当然是一个临时测试,看看我是否正确 - 或者只使用 NSProcessInfo 的 beginActivityWithOptions:reason:告诉系统该事件是用户发起的,不应限制该应用。
关于objective-c - cocoa WebView : Load-time when computer idles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25424930/