2013-08-29 5 views
5

मेरे पास एक ऐसा फ़ंक्शन है जो इंटरनेट से कनेक्ट होता है और फिर तालिका में सेल्स को रीफ्रेश करता है।UITableView reloadData धीमा है

मेरे समारोह है:

- (void) updateMethod 
{ 

    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    queue.name = @"Data request queue"; 

    [queue addOperationWithBlock:^{ 

     //neither of these delay the responsiveness of the table 
     [columnArrayBackground removeAllObjects]; 
     [self getColumnDataBackground]; 

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

      for (int i=0; i < 6; i++) { 
       columnArray[i] = columnArrayBackground[i]; 
      }; 

      //THIS ONE LINE CAUSES DELAYS 
      [homeTable reloadData]; 


     }]; 
    }]; 
} 

सब कुछ [homeTable reloadData] के अलावा सुपर तेजी से है। जब मैं इसे टिप्पणी करता हूं, तो मुझे त्वरित प्रतिक्रिया मिलती है। जब मैं इसे अपूर्ण करता हूं, तो मेरी सेल प्रतिक्रिया कभी-कभी कुछ सेकंड तक लगी है!

मेरा अन्य रीलोडडाटा कॉल मेरे ऐप में देरी नहीं करता है। क्या मैं NSOperationQueue को सही ढंग से कार्यान्वित नहीं कर रहा हूं?

+0

क्या आप केवल दृश्यमान कोशिकाओं को पुनः लोड करने का प्रयास कर सकते हैं? यदि उपयोगकर्ता डेटा डाउन होने से पहले आपका डेटा स्रोत अपडेट कर दिया गया है, तो यह तेज़ हो सकता है यानी [homeTable reloadRowsAtIndexPaths: [homeTable indexPathsForVisibleRows]] – Max

+0

तालिका दृश्य प्रतिनिधि विधियां दिखाएं। 'GetColumnDataBackground' क्या करता है? आपको कैसे पता चलेगा कि यह 'देरी' कर रहा है? – Wain

उत्तर

6

अपनी अद्यतन विधि से कतार निकालें और केवल तालिका को अपडेट करें छोड़ दें। आपकी तालिका को रीफ्रेश करने वाली क्रिया के तहत यह कोड जोड़ें। जहां updateMethod वह कोड है जो तालिका को अद्यतन करता है। केवल जब आप मुख्य धागे पर वापस आते हैं तो क्या आप डेटा पुनः लोड करते हैं। उम्मीद है की यह मदद करेगा!

//perform on new thread to avoid the UI from freezing 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), 
       ^{ 
        //background thread code 
        [self performSelector:@selector(updatemethod:) withObject:nil]; 
        dispatch_async(dispatch_get_main_queue(), 
            ^{ //back on main thread 
             [self.tableView reloadData]; 
            });}); 
+0

यह कोड संभावित रूप से दौड़ का कारण बनता है, जब पृष्ठभूमि धागा और मुख्य धागा एक साथ प्रदर्शित डेटा को समेकित रूप से एक्सेस और संशोधित करता है। – CouchDeveloper

संबंधित मुद्दे