2011-03-10 18 views
8

उदाहरण के लिए, GKScore के reportScoreWithCompletionHandler (documentation) में, आप कॉलआईओएस पूरा करने वाले हैंडलर ब्लॉक किस धागे में हैं?

[score reportScoreWithCompletionHandler:^(NSError *error) { 
    // do some stuff that may be thread-unsafe 
}]; 

जिसमें धागा पूरा होने हैंडलर बुलाया जाएगा लगता है: मुख्य थ्रेड, reportScoreWithCompletionHandler रूप में एक ही धागा बुलाया गया था, या एक अलग धागा (संभवतः थ्रेड जो वास्तविक स्कोर रिपोर्टिंग किया जाता है)?

दूसरे शब्दों में, क्या पूरा करने वाले हैंडलर में किए गए काम को थ्रेड-सुरक्षित होना चाहिए (जैसा कि इससे कोई फर्क नहीं पड़ता कि यह किस धागे में किया गया है)?

उत्तर

6

व्यावहारिक शर्तों में इससे कोई फर्क नहीं पड़ता।

आप मुख्य थ्रेड में चलाने के लिए अपने पूरा होने की जरूरत है, सिर्फ मुख्य थ्रेड पर यह प्रेषण:

[score reportScoreWithCompletionHandler:^(NSError *error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // do your stuff here 
    }); 
}]; 
+0

दिलचस्प। क्या यह रन लूप के साथ पूरी तरह से interleave है? (यानी, जब पूरा करने वाले हैंडलर को बुलाया जाता है, तो प्रेषित कार्य को अगले रन लूप पुनरावृत्ति से ठीक पहले बुलाया जाएगा, या कुछ देरी हो सकती है?) –

+0

मुझे लगता है कि मुख्य थ्रेड रनलोप सामान्य घटना के हिस्से के रूप में कतारबद्ध ब्लॉक को संसाधित करेगा प्रसंस्करण चक्र तो यह "जल्द ही" होना चाहिए, लेकिन सभी चीजों के साथ runloop संबंधित, समय की गारंटी नहीं है। – mlaster

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