AMcoder - javascript, python, java, html, php, sql

NSURLCache-ը չի աշխատում

Ես նախաստորագրեցի NSURLCache-ն իմ հավելվածի պատվիրակում այսպես.

int cacheSizeMemory = 4*1024*1024;  // 4MB
int cacheSizeDisk   = 32*1024*1024; // 32MB
MyServerCache *sharedCache = [[MyServerCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[MyServerCache setSharedURLCache:sharedCache]; 

Այնուհետև ես ստեղծում եմ հարցում լռելյայն քեշի քաղաքականությամբ և զանգում.

[NSURLConnection sendSynchronousRequest: urlRequest
                      returningResponse: &response
                                  error: pError ];

Պատասխանը «application/json» տիպի է և ունի «Cache-Control» դրված է «private, max-age=600»: Պատասխանն ընդամենը 874 բայթ է (չպետք է չափազանց մեծ լինի քեշի համար), սակայն NSURLCache-ը կարծես թե չի աշխատում:

Ես սա գործարկել եմ սիմուլյատորի վրա և փնտրել եմ սկավառակի քեշը, որը կարծես թե գոյություն չունի, ուստի ես ենթադասավորեցի NSURLCache (MyServerCache) և խախտեցի հետևյալ մեթոդները՝ տեսնելու, թե արդյոք դրանք կանչվում են.

-(NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
{
  NSLog(@"Returning cached response for request:  %@", request);
  return [super cachedResponseForRequest:request];
}

-(void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request
{
  NSLog(@"Caching response for request: %@", request);
  [super storeCachedResponse:cachedResponse forRequest:request];
}

Անկախ նրանից, թե ինչ եմ ես անում (և ես փորձել եմ մի քանի տարբեր API-ներ և պատասխաններ), NSURLCache-ը երբեք ոչինչ չի պահում: Ես երբեք չեմ կարող գտնել սկավառակի քեշը ֆայլային համակարգում, և վերը նշված մեթոդները երբեք չեն կանչվում NSURLCache-ի իմ ենթադասում (MyServerCache):

Ես իսկապես կցանկանայի օգտագործել սա, այլ ոչ թե գլորել իմ սեփական քեշը, բայց ես գաղափար չունեմ, թե ինչու այն չի աշխատում կամ ինչպես այն գործի դնել: Խնդրում ենք օգնել.


  • Ի՞նչ է UVMServerCache-ը: Ինչո՞ւ այս դասի փոխարեն չեք օգտագործում NSURLCache: 27.01.2014
  • Դա NSURLCache-ի ենթադաս է, որտեղ ես միայն վերացրել եմ վերը նշված մեթոդները: Ես դա արեցի, որպեսզի կարողանամ իմանալ, արդյոք այն իրականում փորձում է քեշավորել պատասխանները և/կամ վերադարձնել քեշավորված պատասխանները: Քանի որ ես օգտագործում եմ դասի մեթոդ NSURLConnection-ում, ես չեմ կարող կիրառել դրա պատվիրակության մեթոդները, որպեսզի փորձեմ այնտեղ ընդհատել... ուստի NSURLCache ենթադասավորումը թվում էր միակ այլ տարբերակ... 27.01.2014
  • Փորձե՞լ եք օգտագործել ստանդարտ դասը ձեր սովորույթի փոխարեն: Միայն թեստային նպատակներով, միգուցե սրանից հետո ինչ-որ սկավառակի քեշ կգտնե՞ք: 28.01.2014
  • Ես դա փորձեցի առաջինը: Երբ դա չաշխատեց, ես ենթադասակարգեցի, որպեսզի ավելի լավ տեսանելիություն ստանամ իրականում տեղի ունեցողի նկատմամբ: 28.01.2014
  • @HackyStack Երբևէ հասկացե՞լ եք սա: Ես աշխատում եմ նման բանի վրա՝ օգտագործելով iOS7-ի NSURLSession դասերը (որոնք օգտագործում են NSURLCache): stackoverflow .com/questions/21957378/ 25.02.2014

Պատասխանները:


1

Դուք պետք է ստեղծեք ձեր հարցումը NSURLRequestUseProtocolCachePolicy-ով, և այն հիանալի աշխատում է NSURLCache-ի հետ:

NSURLRequestCachePolicy cachePolicy = NSURLRequestUseProtocolCachePolicy;
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:cachePolicy 

NSURLRequestCachePolicy-ի մասին կարող եք կարդալ այստեղ՝ https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/#//apple_ref/c/tdef/NSURLRequestCachePolicy

Մի փոքր շփոթեցնող է, որ iOS-ը միշտ վերադարձնում է 200 - Success, այնպես որ դուք երբեք չեք ստանա 304 - Resource not Modified, երբ պատասխանը գալիս է քեշից: Այսպիսով, ավելի հեշտ է տեսնել, որ քեշի քաղաքականությունը աշխատում է սերվերի կողմը վերահսկելիս:

Դուք կարող եք օգտագործել https://github.com/PaulEhrhardt/Simple-Cache-Test՝ վավերացնել cache-control-ը, ժամկետանց և ETag մի փոքր տեղական ruby ​​սերվերով: Դա ընդամենը մի քանի տող է կարգավորելու համար: Ես երկուսն էլ հաջողությամբ փորձարկեցի 7.1 և 8.4 iOS SDK-ով:

15.09.2015
Նոր նյութեր

Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..