2012-05-10 16 views
5

मेरे पास कुछ सामग्री के साथ UITableView है, जो असीमित तरीके से लोड किया गया है। जब उपयोगकर्ता डिवाइस को घुमाता है तो मुझे [tableView reloadData]-willRotateToInterfaceOrientation विधि में बनाने की आवश्यकता है। ReloadData मेरे मामले में एसिंक्रोनस काम करता है।मेन थ्रेड को कुछ एसिंक कार्रवाई करने तक प्रतीक्षा कैसे करें?

मैं समझता हूं कि पुनः लोडडेटा मुख्य धागे में काम करता है, लेकिन यह सेलफॉररोएट इंडेक्सपैथ को सक्रिय करता है, जो मेरे मामले में एसिंक काम करता है।

तो प्रश्न यह है कि UITableView's reloadData समाप्त होने तक मुख्य धागा प्रतीक्षा कैसे करें।

उत्तर

2

यदि आप willRotateToInterfaceOrientation से reloadData को कॉल करते हैं तो इसे मुख्य थ्रेड पर कॉल किया जाता है। असल में UIViews थ्रेड सुरक्षित नहीं हैं और केवल मुख्य धागे से ही निपटाया जाना चाहिए (किसी कारण से किसी को किसी अन्य धागे से पुनः लोडडेटा को कॉल करने का विचार मिलता है)।

मुझे लगता है कि एक शब्द के रूप में "एसिंक्रोनस" से संबंधित भ्रम है। UI प्रतिनिधियों के लिए असीमित कॉलबैक, जैसे willRotateToInterfaceOrientation को मुख्य धागे पर बुलाया जाता है। असीमित होने के लिए जरूरी नहीं है कि एक अलग थ्रेड (हालांकि समानांतर में "असीमित रूप से चल रहा हो)।

मैं NSRunLoop के लिए Apple दस्तावेज़ पर पढ़ने की अनुशंसा करता हूं। यह आईओएस ऐप्स चलाने के तरीके का एक अभिन्न अंग है और ऐप प्रोग्रामर को समझने के लिए जरूरी है।

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

+0

मैं समझता हूं कि पुनः लोडडेटा को मुख्य धागे में बुलाया जाता है। लेकिन realodData CellForRowAtIndexPath को कॉल करता है ... और इस विधि को कुछ डेटा async लोड करने की आवश्यकता है। –

+0

मैं देखता हूं, इसलिए आप पुनः लोड करने के लिए पुनः लोड करने की प्रतीक्षा नहीं कर रहे हैं, लेकिन असीमित कार्य जो पुनः लोड करने के लिए बंद हो जाते हैं। क्या आप इसे प्रतिबिंबित करने के लिए अपने प्रश्न को संशोधित कर सकते हैं? NSRunLoop अभी भी वही है जो आप चाहते हैं, हालांकि मुझे समझ में नहीं आ रहा है कि क्यों आप एसिंक्रोनस डेटा लोड करते समय मुख्य थ्रेड बंधक को पकड़ना चाहते हैं। – NSProgrammer

+0

पुनः लोड करने की प्रतीक्षा करने के लिए मुख्य थ्रेड की आवश्यकता है, क्योंकि यह रोटेशन एनीमेशन सुखद बना देगा। –

3

आप CFRunLoopRun का उपयोग जब तक UITableView डेटा पुनः लोड कर रहा है अपने मुख्य थ्रेड प्रतीक्षा करने के लिए कर सकते हैं। डेटा रीलोड किए जाने के बाद CFRunLoopStop पैरामीटर के रूप में CFRunLoopGetMain का परिणाम गुजर रहा है।

+0

धन्यवाद, मैं इसे दस्तावेज पढ़ने के लिए इतना आसान नहीं देखता हूं। मैं समझने की कोशिश करूँगा। –

2

आपको पृष्ठभूमि में अपनी तालिका का डेटा लोड करने की आवश्यकता होगी, फिर UITableView की पुनः लोडडेटा विधि को कॉल करें।

आप पृष्ठभूमि लोड कतार में असीमित रूप से अपने लोड फ़ंक्शन को आसानी से प्रेषित करने के लिए जीसीडी का उपयोग कर सकते हैं। जब वह कार्य समाप्त हो जाता है, तो वर्कर थ्रेड को मुख्य थ्रेड पर वापस भेज दें जो [tableView reloadData] पर कॉल करता है। यहां बताया गया है कि:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

    ... 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^{ 

    // load your table data here 
    [self loadMyTableData]; 

    // when done dispatch back to the main queue to load the table 
    dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
    dispatch_async(mainQueue, ^{ 

     [self.tableView reloadData]; 
     }); 
    }); 
    ... 
} 
+0

[self loadMyTableData] बनाने के लिए; मुझे डेटा स्टोर करने के लिए कोड के आधे हिस्से को बदलने और इसे अपने उप-वर्गीकृत uitableviewcells पर धक्का देने की आवश्यकता है और इसकी सामग्री –

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