Нужно содержание в UIWebView для отображения быстро

1: Да, Ваши пользователи действительно заботятся. Если они будут использовать программу экранного доступа, она будет потеряна. Если я использую какой-либо другой инструмент, который пытается извлечь информацию из страницы, встречаясь с таблицами, которые не используются для представления табличных данных, вводит в заблуждение.

отделение А или промежуток приемлемы для разделения содержания, потому что , который является точно значением тех элементов . Когда я, поисковая система, программа экранного доступа или что-либо еще, встречусь с элементом таблицы, мы ожидаем, что это означает, что "следующее является табличными данными, представленными в таблице". Когда мы встретимся с отделением, мы ожидаем, что "это - элемент, привыкший к отделение язь мое содержание в отдельные части или области.

2: Удобочитаемость: Неправильно. Если весь код представления находится в css, я могу считать HTML, и я пойму содержание страницы. Или я могу считать css и понять представление. Если все смешано в HTML, я должен мысленно зачеркнуть все связанные с представлением биты, прежде чем я смогу даже видеть то, что довольно и что не. Кроме того, я боялся бы встречать веб-разработчика, который не понял css, таким образом, я действительно не думаю, что это - проблема.

3: Таблицы медленнее: Да, они. Причина проста: Таблицы должны быть проанализированы полностью, включая их содержание, прежде чем они смогут быть представлены. Отделение может быть представлено, когда с ним встречаются, даже прежде , его содержание было проанализировано. Это означает, что отделения обнаружатся, прежде чем страница закончила загружаться.

И затем существует премия, что таблицы намного более хрупки, и будут не всегда представляться тем же в различных браузерах с различными шрифтами и размерами шрифта и всеми другими факторами, которые могут заставить расположение варьироваться. Таблицы являются отличным способом гарантировать, что Ваш сайт будет выключен пикселем или два в определенных браузерах, не масштабируется хорошо, когда пользователь изменяет свой размер шрифта или изменяет его настройки любым другим способом.

, Конечно, № 1 является большим. Много инструментов и приложений зависит от семантического значения веб-страницы. Обычным примером являются программы экранного доступа для слабовидящих пользователей. Если Вы будете веб-разработчиком, Вы найдете, что многие крупные компании, которые могут иначе нанять Вас для работы над сайтом, , требуют , что сайт доступен даже в этом случае. Что означает, что необходимо думать о семантическом значении HTML. С семантической паутиной, или более соответствующим образом, микроформаты, RSS-ридеры и другие инструменты, Ваше содержание страницы больше не просматривается исключительно через браузер.

11
задан Ben Hoyt 3 August 2011 в 18:23
поделиться

4 ответа

Редактировать: просто укажите, что этому вопросу и ответам на него 4 года. Я болтаю про iOS 3.x ниже. Я легко могу себе представить, что за это время все изменилось - черт возьми, одни только устройства быстрее, чем iPhone 3G. YMMV. :)

Я сам смотрел на это некоторое время, пока ничего не реализовал, просто гуглил. В целом кажется, что это очень сложно / невозможно сделать на iPhone с помощью DontLoad. Даже в марте были сообщения, что он работает в Simulator, но не на устройстве: http://discussions.apple.com/message.jspa?messageID=9245292

Я просто предполагаю, но на основе даже другие вопросы StackOverflow (например, этот) I ' Я думаю, что, возможно, кэширование на устройстве каким-то образом более ограничено, чем его аналоги для Mac и Safari.

Другие участники форумов Apple сообщают о случаях с грубыми инженерами, когда спрашивают о UIWebView и NSURLCache, где в отчетах об ошибках инженеры говорят, что это должно работать , но настоящие разработчики говорят, что это не так. http://discussions.apple.com/thread.jspa?threadID=1588010 (29 июля - 20 августа)

Некоторые решения можно найти здесь . Рассматривая [UIImage imageWithData: ...], Дэвид описывает некоторый код для «реализации асинхронного кэширующего загрузчика изображений для iPhone».

И теперь я обнаружил это письмо от 10 августа в списке рассылки cocoa-dev:

10 августа 2009 г., в 13:38 Майк Манзано написал:

Кто-нибудь смог успешно

Другие участники форумов Apple сообщают о случаях грубого обращения с инженерами, когда спрашивают о UIWebView и NSURLCache, где в отчетах об ошибках инженеры говорят, что это должно работать, но настоящие разработчики говорят, что это не так. http://discussions.apple.com/thread.jspa?threadID=1588010 (29 июля - 20 августа)

Некоторые решения можно найти здесь . Рассматривая [UIImage imageWithData: ...], Дэвид описывает некоторый код для «реализации асинхронного кэширующего загрузчика изображений для iPhone».

И теперь я обнаружил это письмо от 10 августа в списке рассылки cocoa-dev:

10 августа 2009 г., в 13:38 Майк Манзано написал:

Кто-нибудь смог успешно

Другие участники форумов Apple сообщают о случаях грубого обращения с инженерами, когда спрашивают о UIWebView и NSURLCache, где в отчетах об ошибках инженеры говорят, что это должно работать, но настоящие разработчики говорят, что это не так. http://discussions.apple.com/thread.jspa?threadID=1588010 (29 июля - 20 августа)

Некоторые решения можно найти здесь . Рассматривая [UIImage imageWithData: ...], Дэвид описывает некоторый код для «реализации асинхронного кэширующего загрузчика изображений для iPhone».

И теперь я обнаружил это письмо от 10 августа в списке рассылки разработчиков какао:

10 августа 2009 г., в 13:38 Майк Манзано написал:

Кто-нибудь смог успешно но настоящие разработчики говорят, что это не так. http://discussions.apple.com/thread.jspa?threadID=1588010 (29 июля - 20 августа)

Некоторые решения можно найти здесь . Рассматривая [UIImage imageWithData: ...], Дэвид описывает некоторый код для «реализации асинхронного кэширующего загрузчика изображений для iPhone».

И теперь я обнаружил это письмо от 10 августа в списке рассылки cocoa-dev:

10 августа 2009 г., в 13:38 Майк Манзано написал:

Кто-нибудь смог успешно но настоящие разработчики говорят, что это не так. http://discussions.apple.com/thread.jspa?threadID=1588010 (29 июля - 20 августа)

Некоторые решения можно найти здесь . Рассматривая [UIImage imageWithData: ...], Дэвид описывает некоторый код для «реализации асинхронного кэширующего загрузчика изображений для iPhone».

И теперь я обнаружил это письмо от 10 августа в списке рассылки cocoa-dev:

10 августа 2009 г., в 13:38 Майк Манзано написал:

Кто-нибудь смог успешно получить систему загрузки URL на iPhone обратить внимание на кастомные версии NSURLCache? Мне кажется что это Быть игнорированным. Подробнее здесь:

[ссылка на эту страницу; удалено.]

(См. второй "ответ" на это страницу).

Просто нужна подсказка, если я делает что-то не так или мой код просто игнорируется.

Да, у меня получилось - просто требует создания собственного кеша экземпляр и явно установив общий кеш для этого нового экземпляра.

Но это действительно сработало - однажды реализовано, моя "установка табличного представления изображение ячейки в изображение из сети " прекрасно работает (и без прокрутки было в лучшем случае болезненно).

Glenn Andreas gandreas @ xxxxxxxxxxxx http://www.gandreas.com/ злая забава! Безумный, плохой и опасный знать

Вышеупомянутое электронное письмо можно найти по адресу http://www.cocoabuilder.com/archive/message/cocoa/2009/8/10/242484 (без дальнейшие ответы)

Дополнительное доказательство того, что NSURLCache может работать, можно найти в блоге iCab: Фильтрация URL-адресов для UIWebView на iPhone (18 августа 2009 г.)

Всем, кто здесь, вероятно, также стоит взглянуть на образец URLCache от Apple приложение, поскольку оно может иметь отношение к их работе: https://developer.apple.com/iphone/library/samplecode/URLCache/index.html Если только что посмотрел на него сейчас, там написано: «Это приложение не использует диск NSURLCache или кэш памяти, поэтому наша политика кеширования заключается в удовлетворении запроса путем загрузки данных из его источника ". и использует cachePolicy: NSURLRequestReloadIgnoringLocalCacheData . Так что это менее актуально, чем я думал, и почему этот человек называл NSURLCache шуткой.

Кажется, NSURLCache не так сложен или невозможен, как я начал этот пост, сказав. Мне нужно искать способ, который работает, и одновременно выяснять причины, по которым он не работает. Я все еще не могу поверить, что есть только 25 результатов поиска Google для "iphone" и "NSURLRequestReturnCacheDataDontLoad" ... В этом ответе есть почти все из них. И я рад, что написал это, чтобы я мог к нему обратиться позже; -)

10
ответ дан 3 December 2019 в 08:56
поделиться

Создайте NSURLRequest с + requestWithURL: cachePolicy: timeoutInterval: . Установите для политики кеширования значение NSURLRequestReturnCacheDataDontLoad . Загрузите запрос в веб-просмотр, используя -loadRequest: . Полная документация здесь .

1
ответ дан 3 December 2019 в 08:56
поделиться

Спасибо за инициативу! Это заставило меня оторваться. К сожалению, мне кажется, что я столкнулся с рядом препятствий.

Проблема в том, что если я использую NSURLRequestReturnCacheDataDontLoad, я думаю, что загружаемые ресурсы уже должны быть в кеше.

Чтобы поместить их в кеш , Я попробовал следующее:

    NSURLRequest *request =     [NSURLRequest 
                            requestWithURL:cachedURL 
                            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
                            timeoutInterval:60.0] ;

    NSURLResponse *responseToCache = 
                        [[NSURLResponse alloc]
                            initWithURL:[request URL] 
                            MIMEType:@"text/html" 
                            expectedContentLength:[dataAtURL length] 
                            textEncodingName:nil] ;

    NSCachedURLResponse *cachedResponse = 
                        [[NSCachedURLResponse alloc]
                            initWithResponse:responseToCache data:dataAtURL
                            userInfo:nil storagePolicy:NSURLCacheStorageAllowedInMemoryOnly] ;

        // Store it
    [[NSURLCache sharedURLCache] storeCachedResponse:cachedResponse forRequest:request] ;

    [responseToCache release] ;
    [cachedResponse release] ;

    NSLog(  @"*** request %@, cache=%@", request ,[[NSURLCache sharedURLCache] 
            cachedResponseForRequest:request]                           ) ;

Я получил этот код откуда-то в сети, но я думаю, что, хотя он работал на Mac, он не работает на iPhone, моей целевой платформе.

Это не так. кажется, вставляете элемент в кеш; NSLog выводит null для «cache =% @».

Затем я попытался перегрузить NSURLCache:

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
    {
    NSLog( @"FileFriendlyURLCache asked from request %lx of type %@ for data at URL: %@" , 
        request , [request class] , [[request URL] absoluteString] ) ;

    NSCachedURLResponse *result = nil ;

    if( [[[request URL] absoluteString] hasPrefix:@"file://"] )
        {
        NSLog( @"\tFulfilling from cache" ) ;

        NSError *error = nil ;
        NSData *dataAtURL = [NSData dataWithContentsOfURL:[request URL] 
                        options:0 error:&error] ;
        if( error )
            NSLog( @"FileFriendlyURLCache encountered an error while loading %@: %@" ,
                [request URL] , error ) ;

        NSURLResponse *reponse = [[NSURLResponse alloc]
                                    initWithURL:[request URL] 
                                    MIMEType:@"text/html" 
                                    expectedContentLength:[dataAtURL length] 
                                    textEncodingName:nil] ;
        result = [[NSCachedURLResponse alloc] initWithResponse:reponse data:dataAtURL
            userInfo:nil storagePolicy:NSURLCacheStorageAllowedInMemoryOnly] ;

        #warning LEOPARD BUG MAKES IT SO I DONT AUTORELEASE result NSCachedURLResponse

        [reponse release] ;
        }
    else
        {
        NSLog( @"\tFulfilling from web" ) ;
        result = [super cachedResponseForRequest:request] ;
        }

    NSLog( @"Result = %@" , result ) ;

    return result ;
    }

В моем запросе я указываю политику кеширования NSURLRequestReturnCacheDataDontLoad. Кажется, что этот метод вызывается нормально, но на iPhone он ведет себя странно. Независимо от того, возвращаю ли я экземпляр NSCachedURLResponse, UIWebView все равно возвращает ошибку:

Error Domain=NSURLErrorDomain Code=-1008 UserInfo=0x45722a0 "resource unavailable"

Это как если бы UIWebView игнорировал тот факт, что он возвращает что-то, кроме nil, и все равно терпит неудачу. Затем у меня возникли подозрения, и я подумал, что вся система загрузки URL-адресов просто игнорирует все, что исходит от -cachedResponseForRequest, поэтому я создал подкласс NSCachedURLResponse, который выглядит следующим образом:

@implementation DebugCachedURLResponse

- (NSData *)data
    {
    NSLog( @"**** DebugCachedURLResponse data accessed." ) ;
    return [super data] ;
    }

- (NSURLResponse *)response
    {
    NSLog( @"**** DebugCachedURLResponse response accessed." ) ;
    return [super response] ;
    }

- (NSURLCacheStoragePolicy)storagePolicy
    {
    NSLog( @"**** DebugCachedURLResponse storagePolicy accessed." ) ;
    return [super storagePolicy] ;
    }

- (NSDictionary *)userInfo
    {
    NSLog( @"**** DebugCachedURLResponse userInfo accessed." ) ;
    return [super userInfo] ;
    }
@end

Затем я изменил -cachedResponseForRequest, чтобы вместо этого использовать этот класс:

    result = [[DebugCachedURLResponse alloc] initWithResponse:reponse data:dataAtURL
        userInfo:nil storagePolicy:NSURLCacheStorageAllowedInMemoryOnly] ;

Я установил для запроса политику кеширования NSURLRequestUseProtocolCachePolicy и запустил программу. Хотя я вижу, что моя версия -cachedResponseForRequest вызывается и возвращает DebugCachedURLResponses для всех URL-адресов файлов, ни одна из моих отладок не вызывается, сообщая мне, что мои экземпляры DebugCachedURLResponse полностью игнорируются!

Итак, здесь я снова застрял. Не думаю, что у вас есть другие идеи?

Большое спасибо за ваш первый ответ.

1
ответ дан 3 December 2019 в 08:56
поделиться

Привет, ребята, я думаю, что нашел проблему. Похоже, что NSURLRequestReturnCacheDataElseLoad и NSURLRequestReturnCacheDataDontLoad не работают на iPhone. Когда NSCachedURLResponse возвращается из кеша и содержит заголовки HTTP, указывающие на то, что срок действия содержимого истек (например, Expires, Cache-Control и т. Д.), Кешированный ответ игнорируется, и запрос выполняется к исходному источнику.

Решение заключается в следующим образом:

  1. Реализуйте свой собственный подкласс NSHTTPURLResponse, который позволяет вам изменять словарь allHeaderFields.
  2. Реализуйте свой собственный NSURLCache, переопределив cachedResponseForRequest: и вернуть новый NSCachedURLResponse, содержащий экземпляр вашего подкласса NSHTTPURLResponse с удаленными соответствующими HTTP-заголовками «истечения срока действия».
1
ответ дан 3 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: