Cocoa WebView: время загрузки при простое компьютера

Я написал простое приложение для Mac OS. Представление содержит только скрытый WebView и NSTextView. В определенное время будет проанализировано 100 URL-адресов один за другим. URL-адрес загружается в WebView, происходит некоторый синтаксический анализ дерева DOM, полоскание и повторение.

Все работает нормально, за исключением некоторых существенных различий во времени загрузки, когда компьютер находится в режиме ожидания (без активности пользователя). Когда я использую компьютер, URL загружается примерно 2 секунды. Когда я не использую компьютер в течение некоторого времени, загрузка URL-адреса занимает около 1 минуты.

Когда я возвращаюсь к компьютеру через некоторое время и вижу в TextView, что последние URL-адреса заняли около минуты, следующие сразу будут загружены за секунды. Так что это должно быть что-то с активностью пользователя в системе. Верно? Кто-нибудь знает, почему?

I am on 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];
}

person DaneOzzo    schedule 21.08.2014    source источник


Ответы (1)


Держу пари, AppNap пинает и голодает ваш процесс ресурсов.

Вы можете отключить AppNap в окне Finder Get Info вашего приложения — временная проверка, чтобы убедиться, что я прав, — или просто использовать beginActivityWithOptions:reason: чтобы сообщить системе, что действие было инициировано пользователем и приложение не должно регулироваться.

person RyanWilcox    schedule 24.08.2014