2012-06-28 17 views
8

के लिए प्री-कैश छवियां जब मेरा ऐप लोड होता है, तो मैं 99 ऑब्जेक्ट्स का JSON प्रतिनिधित्व खींचता हूं।AFNetworking की UIImageView श्रेणी

प्रत्येक ऑब्जेक्ट में 'image_url' फ़ील्ड होता है, जिसे मैं AFNetworking के setImageWithURLRequest पर भेजता हूं।

मेरी छवियां तालिका में लोड होती हैं, और इसके परिणामस्वरूप, केवल पहले कई कक्ष अपनी छवियों के लिए अनुरोध करते हैं। यह तब तक नहीं है जब तक मैं स्क्रॉल नहीं करता कि बाद के छवि अनुरोध किए गए हैं।

एक बार जब मैं प्रारंभिक डेटासेट खींचता हूं, तो मैं उस पृष्ठभूमि प्रक्रिया को बंद करने में सक्षम होना चाहता हूं जो 95 या इतनी वस्तुओं को शुरू करता है जो प्रारंभ में दिखाई नहीं दे रहे हैं, और उन्हें इस तरह से कैश करें जब setImageWithURLRequest कहा जाता है, तो इसमें पहले से ही एक कैश की गई छवि होगी।

एएफआईमेज कैश निजी है, इसलिए मुझे यकीन नहीं है कि यह संभव है या नहीं। मुझे पता है कि मैं NSURLCache के साथ कैश कर सकता हूं, लेकिन फिर मेरे पास दो अलग, पृथक कैश होंगे, और यह आदर्श भी नहीं है।

क्या मेरा एकमात्र विकल्प AFNetworking की UIImageView श्रेणी का उपयोग नहीं करना है?

ये जवाब मुझे ऐसा लगता है कि:

iOS Caching images with AFImageCache doesn't seem to work
How to configure the cache when using AFNetworking's setImageWithURL

+0

रैम में 95 छवियों को कैशिंग में बहुत सारे रैम लगेगा। यदि आप ऐसा करते हैं तो कृपया निर्मित कैश का उपयोग न करें, लेकिन कैश निर्देशिका में डिस्क कैश में बनाएं। –

+0

मुझे बिल्कुल वही समस्या है। मैं डिस्क पर छवियों को कैशिंग कर रहा हूँ। लेकिन जब मैं उन्हें कैश से लोड करने की कोशिश कर रहा हूं, कभी-कभी वे नहीं मिलते हैं। मैंने http://stackoverflow.com/questions/12882639/how-should-i-pre-load-all-images-and-cache-them-using-afnetworking – Burak

उत्तर

24

कृपया, कृपया ऐसा नहीं करते हैं।

मेरा विश्वास करो जब मैं कहता हूं कि यह लगभग निश्चित रूप से अनावश्यक है।

असल में, यह संभवतः वांछित प्रभाव के विपरीत होगा, छवियों को डाउनलोड करने के दबाव में वृद्धि के कारण शायद कभी नहीं देखा जाएगा।

कैश बहुत अच्छे कारण के लिए निजी है - स्क्रॉल दृश्यों पर बाद के अनुरोधों को तेज़ करने के लिए यह बस है।अनुरोध के अनुसार बस टेबल दृश्य छवियों को डाउनलोड करें, और आपको बस ठीक होना चाहिए। यदि कुछ भी हो, तो आप उन छवियों के आकार को अनुकूलित कर सकते हैं जिन्हें आप डाउनलोड कर रहे हैं (सही छवि आयाम सुनिश्चित करें; बुद्धिमानी से संपीड़ित करें)।

+4

मैं केवल अगले 3 या 4 छवियों को कैसे लोड करूं? –

3

यहाँ एक समाधान है - कुछ UIImageView वस्तुओं को बनाने के (लेकिन उनमें subviews के रूप में जोड़ नहीं है) और फिर AFNetworking के UIImageView श्रेणी का उपयोग लाने के लिए छवियों और अपने आंतरिक कैश populate।

नमूना कोड:

NSArray *strings = [NSArray arrayWithObjects: 
        @"http://i.imgur.com/IpQzE.png", 
        @"http://i.imgur.com/sDnLs.jpg", 
        nil]; 

for (NSString *string in strings) { 
    UIImageView *imageView = [[[UIImageView alloc] init] autorelease]; 
    [imageView setImageWithURL:[NSURL URLWithString:string]]; 
} 
+0

पर सवाल पूछा। मैं वास्तव में एक ही विचार था, लेकिन मैं बनाए गए सभी UIImageViews के अतिरिक्त ओवरहेड के बारे में निश्चित नहीं था। क्या ऐसा कुछ नहीं है जिसके बारे में मुझे चिंता करने की ज़रूरत है? मैं 100-500 छवियों के साथ ऐसा कर रहा हूँ। – djibouti33

+0

UIImage ऑब्जेक्ट्स का मेमोरी उपयोग UIImageViews से बहुत अधिक होगा (विशेष रूप से यदि उन्हें कभी भी उपव्यू के रूप में नहीं जोड़ा जाता है)। आप जिस भी रणनीति का उपयोग कर रहे हैं, आपको वास्तविक हार्डवेयर पर इंस्ट्रूमेंट्स के साथ अपने प्रदर्शन की सावधानीपूर्वक जांच करनी होगी। आप कई छवियों को डाउनलोड करने वाली स्मृति चेतावनियों को ट्रिगर कर सकते हैं, जिसके परिणामस्वरूप छवि कैश साफ़ हो जाएगा (एनएससीएच के लिए प्रलेखन की जांच करें) –

1

आप शायद Fully-Loaded

एक साधारण आत्म बनाए रखा कैश छवियों को डाउनलोड करने और एक यूआरएल निर्भर फ़ाइल नाम के बचाने के लिए है पर विचार करना चाहते।

जब भी आप किसी यूआरएल से एक छवि लोड करना चाहते हैं, तो पहले हार्डडिस्क से पढ़ने का प्रयास करें - अगर शून्य वापस आ गया है, तो अपने छवि डाउनलोडर के साथ आगे बढ़ें।

हालांकि अपने छवि कैश को साफ़ करना याद रखें।

5

मैं आपके उद्देश्य को प्राप्त करने के लिए UIImageView का एक गुच्छा नहीं बनाउंगा, यह वास्तव में अक्षम दृष्टिकोण होगा।

आप इस क्षमता को प्राप्त करने के लिए UIImageView+AFNetworking.h पर अपना स्वयं का तरीका जोड़ सकते हैं। मैं पतला यह सबसे अच्छा तरीका होगा। एक अपरीक्षित उदाहरण होगा:

+ (void) cacheImageWithURL:(NSURL *)url 
{ 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0]; 
    [request setHTTPShouldHandleCookies:NO]; 
    [request setHTTPShouldUsePipelining:YES]; 

    AFImageRequestOperation *requestOperation = [[[AFImageRequestOperation alloc] initWithRequest:request] autorelease]; 
    [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     [[[self class] af_sharedImageCache] cacheImage:responseObject forRequest:request]; 
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) {}]; 
}