1: Да, Ваши пользователи действительно заботятся. Если они будут использовать программу экранного доступа, она будет потеряна. Если я использую какой-либо другой инструмент, который пытается извлечь информацию из страницы, встречаясь с таблицами, которые не используются для представления табличных данных, вводит в заблуждение.
отделение А или промежуток приемлемы для разделения содержания, потому что , который является точно значением тех элементов . Когда я, поисковая система, программа экранного доступа или что-либо еще, встречусь с элементом таблицы, мы ожидаем, что это означает, что "следующее является табличными данными, представленными в таблице". Когда мы встретимся с отделением, мы ожидаем, что "это - элемент, привыкший к отделение язь мое содержание в отдельные части или области.
2: Удобочитаемость: Неправильно. Если весь код представления находится в css, я могу считать HTML, и я пойму содержание страницы. Или я могу считать css и понять представление. Если все смешано в HTML, я должен мысленно зачеркнуть все связанные с представлением биты, прежде чем я смогу даже видеть то, что довольно и что не. Кроме того, я боялся бы встречать веб-разработчика, который не понял css, таким образом, я действительно не думаю, что это - проблема.
3: Таблицы медленнее: Да, они. Причина проста: Таблицы должны быть проанализированы полностью, включая их содержание, прежде чем они смогут быть представлены. Отделение может быть представлено, когда с ним встречаются, даже прежде , его содержание было проанализировано. Это означает, что отделения обнаружатся, прежде чем страница закончила загружаться.
И затем существует премия, что таблицы намного более хрупки, и будут не всегда представляться тем же в различных браузерах с различными шрифтами и размерами шрифта и всеми другими факторами, которые могут заставить расположение варьироваться. Таблицы являются отличным способом гарантировать, что Ваш сайт будет выключен пикселем или два в определенных браузерах, не масштабируется хорошо, когда пользователь изменяет свой размер шрифта или изменяет его настройки любым другим способом.
, Конечно, № 1 является большим. Много инструментов и приложений зависит от семантического значения веб-страницы. Обычным примером являются программы экранного доступа для слабовидящих пользователей. Если Вы будете веб-разработчиком, Вы найдете, что многие крупные компании, которые могут иначе нанять Вас для работы над сайтом, , требуют , что сайт доступен даже в этом случае. Что означает, что необходимо думать о семантическом значении HTML. С семантической паутиной, или более соответствующим образом, микроформаты, RSS-ридеры и другие инструменты, Ваше содержание страницы больше не просматривается исключительно через браузер.
Редактировать: просто укажите, что этому вопросу и ответам на него 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" ... В этом ответе есть почти все из них. И я рад, что написал это, чтобы я мог к нему обратиться позже; -)
Создайте NSURLRequest
с + requestWithURL: cachePolicy: timeoutInterval:
. Установите для политики кеширования значение NSURLRequestReturnCacheDataDontLoad
. Загрузите запрос в веб-просмотр, используя -loadRequest:
. Полная документация здесь .
Спасибо за инициативу! Это заставило меня оторваться. К сожалению, мне кажется, что я столкнулся с рядом препятствий.
Проблема в том, что если я использую 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 полностью игнорируются!
Итак, здесь я снова застрял. Не думаю, что у вас есть другие идеи?
Большое спасибо за ваш первый ответ.
Привет, ребята, я думаю, что нашел проблему. Похоже, что NSURLRequestReturnCacheDataElseLoad и NSURLRequestReturnCacheDataDontLoad не работают на iPhone. Когда NSCachedURLResponse возвращается из кеша и содержит заголовки HTTP, указывающие на то, что срок действия содержимого истек (например, Expires, Cache-Control и т. Д.), Кешированный ответ игнорируется, и запрос выполняется к исходному источнику.
Решение заключается в следующим образом: