2011-05-24 11 views
12

मैं पहली बार उद्देश्य-सी ब्लॉक और ऑपरेशन कतार का उपयोग कर रहा हूं। मुख्य यूआई स्पिनर दिखाता है, जबकि मैं कुछ रिमोट डेटा लोड कर रहा हूं। मैं तालिका को अपने डेटा को पुनः लोड करने के लिए बताने के लिए एक समापन ब्लॉक का उपयोग कर रहा हूं। documentation mentions के रूप में, समापन ब्लॉक मुख्य थ्रेड पर नहीं चलता है, इसलिए तालिका डेटा को फिर से लोड करती है लेकिन जब तक आप मुख्य थ्रेड पर कुछ नहीं करते हैं, तब तक तालिका को खींचें।क्या यह ऑपरेशन कतार पूर्णता ब्लॉक का सही उपयोग है?

अब जिस समाधान का उपयोग कर रहा हूं वह एक प्रेषण कतार है, क्या यह यूआई को एक पूर्णता ब्लॉक से रीफ्रेश करने का "सर्वश्रेष्ठ" तरीका है?

// define our block that will execute when the task is finished 
    void (^jobFinished)(void) = ^{ 
     // We need the view to be reloaded by the main thread 
     dispatch_async(dispatch_get_main_queue(),^{ 
      [self.tableView reloadData]; 
     }); 
    }; 

    // create the async job 
    NSBlockOperation *job = [NSBlockOperation blockOperationWithBlock:getTasks]; 
    [job setCompletionBlock:jobFinished]; 

    // put it in the queue for execution 
    [_jobQueue addOperation:job]; 

अद्यतन @ gcamp के सुझाव के अनुसार, पूरा होने के ब्लॉक बजाय अब मुख्य संचालन कतार का उपयोग करता GCD की:

// define our block that will execute when the task is finished 
void (^jobFinished)(void) = ^{ 
    // We need the view to be reloaded by the main thread 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.tableView reloadData]; }]; 
}; 

उत्तर

17

वास्तव में यह है कि। यदि आप अपने समापन ब्लॉक के लिए जीसीडी के बजाय एक ऑपरेशन कतार का उपयोग करना चाहते हैं तो आप [NSOperationQueue mainQueue] का भी उपयोग कर सकते हैं।

+0

कूल, मुझे मुख्य क्यूई के बारे में पता नहीं था। एक छोटा क्लीनर और उस तरह से अधिक संगत। धन्यवाद! –

+0

क्या [NSOperationQueue mainQueue] और dispatch_get_main_queue() का उपयोग करने के बीच कोई वास्तविक अंतर है? –

+1

परिणाम के मामले में, नहीं। लेकिन यह अलग-अलग है कि आप इसका उपयोग कैसे करते हैं। 'NSOperationQueue' उपयोग करता है (जाहिर है) 'NSOperation' और जीसीडी (dispatch_get_main_queue) ब्लॉक का उपयोग करता है। – gcamp