2017-07-26 18 views
5

में छवियों को ऑप्टिकल रूप से प्रीलोडिंग/प्रीफेचिंग करना मेरे पास एक बहुत ही सामान्य स्थिति है जिसे मैं हल करने में आसान होने की उम्मीद करता हूं - एक यूआईसीओलेक्शन व्यू वाला एक ऐप, जिसमें प्रत्येक सेल में एक एपीआई से प्राप्त छवि में एक छवि होती है http/https के माध्यम से एक वेब सर्वर पर।UICollectionView और UITableView

मैं आईओएस 10 के prefetching in UICollectionView को लागू करने का प्रयास कर रहा हूं, ताकि छवियों की आवश्यकता होने की संभावना है।

यह विभिन्न आवश्यकताओं कि इष्टतम प्रीफेचिंग के लिए पूरा किया जाना चाहिए देखते हैं कि मुझे लगता है:

  1. है कि वास्तव में तुरंत आवश्यक हैं हमेशा सट्टा प्रीफेचिंग ऊपर प्राथमिकता के आधार पर किया जाना चाहिए छवियों के ला रहा है, तब भी जब छवि पहले से ही है लाने के लिए एक कतार।
  2. जब आईओएस हमें बताता है कि एक विशेष छवि को अब प्रीफेच करने की आवश्यकता नहीं है, तो यह (और केवल इसे) prefetch कतार से हटा दिया जाना चाहिए।
  3. यदि कोई छवि अनुरोध किया जाता है तो इसे हमेशा तब तक वितरित किया जाना चाहिए जब तक कि इसके लिए सभी/अनुरोध रद्द नहीं किए जाते हैं (यदि एकाधिक छवियों या एकाधिक दृश्य नियंत्रकों में एक छवि का उपयोग किया जाता है तो गलत होने में आसान)।
  4. प्रीडिटाइज्ड फ़ेचिंग को निरस्त किया जाना चाहिए यदि एंड डिस्प्लेइंग कहा जाता है (लेकिन, अगर प्रीफेचिंग का अनुरोध किया गया था और रद्द नहीं किया गया था, तो छवि को कम प्राथमिकता पर कतार में छोड़ दिया जाना चाहिए)।
  5. विभिन्न सामान्य आवश्यकताएं जो छवि लोडिंग से संबंधित हैं - उदाहरण के लिए। प्रीफेच अनुरोधों के साथ अंतर्निहित प्रणाली को बाढ़ न करें जो तुरंत बैंडविड्थ और सर्वर स्लॉट को उन छवियों से दूर ले जाएगा जो तुरंत आवश्यक हैं।

मैं SDWebImage और Kingfisher जैसे विभिन्न मौजूदा पुस्तकालयों को देखा है, और आश्चर्य है कि वहाँ किसी भी तरह से या तो पुस्तकालय के साथ आसानी से ऊपर आवश्यकताओं को पूरा करने के लिए होने के लिए प्रकट नहीं होता था।

उदाहरण के लिए, SDWebImage दूसरा आवश्यकता को पूरा नहीं करता है - आप केवल cancel all prefetching कर सकते हैं, या आप छवि प्रति एक पूर्व फ़ेचर बनाना चाहिए (जो तब विभिन्न अन्य SDWebImage सुविधाओं का मतलब है, पूर्व के समवर्ती अनुरोधों की संख्या को सीमित करने की तरह प्राप्त छवियों - यानी आवश्यकता 5 - अब काम नहीं करते हैं।)

क्या यह वास्तव में एक कठिन समस्या है? क्या मुझे कुछ स्पष्ट समाधान याद आया? क्या मैं आवश्यकताओं पर विचार कर रहा हूं?

उत्तर

0

ऐसा लगता है कि नवीनतम इंडेक्सपाथ से प्रीफ़ेच इटम्स द्वारा पारित सूचकांक पर्याप्त नहीं है, तो आपको अपनी प्राथमिकता लागू करने की आवश्यकता होगी।

आवश्यकताएं 1, 2, 3 और प्राथमिकता कतार (सॉर्ट किए गए हीप) का उपयोग करके पूरा किया जाना चाहिए। आवश्यकता 4 आपके कार्यान्वयन प्राथमिकता कतार पर निर्भर करता है। 5 काफी व्यापक और अस्पष्ट है, बस लाने के लिए आपकी विधि में कॉल की संख्या सीमित करें। प्राथमिकता कतार एक सामान्य प्रकार लेती है ताकि आप इसे किसी ऑब्जेक्ट/क्लास के साथ उपयोग कर सकें जिसमें आपके द्वारा प्राप्त की जाने वाली वस्तुओं के गुण हैं, नीचे मैं सादगी के लिए indexPath.row का उपयोग करता हूं।

प्राथमिकता कतार बनाएं जो आपके डेटास्रोत और कैश के बीच मध्यस्थ के रूप में कार्य करेगी।

फिर प्राथमिकता कतार को देखकर/किंगफिशर में संग्रहीत करके डेटा को अपने डेटा स्रोत से लाने के लिए सेट करें। अपने डेटा स्रोत -> PriorityQueue -> किंगफिशर -> सेल

func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) { 
    ... 
    for indexPath in IndexPaths { 
     //Add the indexPath to the top of the priority queue 
     //highest priority is determined by the sort function you used when initializing the priority queue. 
     priorityQueue?.enqueue(indexpath.row) 
    } 

    //Call your method for getting the properties 
    self.fetchObjectsByPriority() 
} 


func fetchObjectsByPriority() { 
     if let count = priorityQueue?.count { 
     for _ in 0...count { 

      //get the index 
      var index = self.priorityQueue?.dequeue() 
      //Alternatively .peek() with out dequeuing item 
      //get image data and store 
      dataSource[index].image = ... 

     } 
    } 
} 

सुनिश्चित करें कि आप एक तरह से समारोह के साथ प्राथमिकता कतार प्रारंभ करते हैं।

आप here से प्रीबिल्ट प्राथमिकता कतार प्राप्त कर सकते हैं, आपको प्राथमिकता कतार बनाने के लिए heap की भी आवश्यकता होगी।

priority Queues और heap sorting

प्रश्न में कोड के बिना पर

अधिक यह एक प्रभावी समाधान की पेशकश करने के लिए मुश्किल है। मुझे उम्मीद है कि यह मदद करता है, चीयर्स और शुभकामनाएँ!