2012-07-18 11 views
6

चलाना समाप्त हो गया है इसलिए मूल रूप से मुझे ब्लॉक समाप्त होने के बाद एक सेगू चलाने में सक्षम होना चाहिए। मेरे पास एक ब्लॉक है जो कुछ JSON सामान करता है और मुझे यह जानने की आवश्यकता है कि यह कब समाप्त हो गया है।एक dispatch_async ब्लॉक को कैसे जांचें

मेरे पास एक कतार है जिसे मैंने json_queue कहा है।

dispatch_async(jsonQueue, ^{ 
    [self doSomeJSON]; 
    [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
    }); 

यह अभ्यस्त मुझे लाइन प्रदर्शन करते हैं: "[आत्म performSegueWithIdentifier: @" modaltomenu

jsonQueue = dispatch_queue_create("com.jaboston.jsonQueue", NULL); 

मैं तो इस सिंटैक्स के साथ dispatch_async ब्लॉक "प्रेषक: स्वयं],"

मुख्य धागे या वेब थ्रेड के अलावा किसी धागे से वेब लॉक प्राप्त करने का प्रयास किया। यह माध्यमिक धागे से UIKit को कॉल करने का परिणाम हो सकता है। अब क्रैशिंग ...

थ्रेड ने अपना गंदा काम कब किया है, यह जानने के लिए मैं कहां से जांच कर सकता हूं ताकि मैं सेगू को कॉल कर सकूं?

धन्यवाद प्यारे लोग।

पुनश्च: बियर और उतार टेडी भालू और जो कोई भी के लिए फूलों की मदद कर सकते < 3.

उत्तर

26

आप मुख्य थ्रेड केवल पर यूआई तरीकों फोन करना चाहिए। PerformSegueWithIdentifier को प्रेषित करने का प्रयास करें: मुख्य कतार पर:

dispatch_async(jsonQueue, ^{ 
    [self doSomeJSON]; 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
    }); 
}); 
+0

आप सर के ऊपर और बियर है। (यही वह जवाब है जिसे मैं ढूंढ रहा था!)। मैं पूरी तरह से भूल गया था कि आप किसी भी समय मुख्यकुछ पर वापस कूद सकते हैं। प्रतिभाशाली। – jimbob

+0

मैं इस सामान के लिए नया हूँ। ब्लॉक के अंदर performSelectorOnMainThread का उपयोग करने से यह बेहतर क्यों है? –

+0

@jimbob मुझे उल्लेख करना चाहिए कि तीसरे पंक्ति में 'dispatch_async' के बजाय' dispatch_sync' का उपयोग करना इस मामले में बेहतर होगा (मैंने इसे संपादित किया है)। WWDC2010 सत्र 206 वीडियो में इस पैटर्न की अनुशंसा की जाती है। @ranReloaded एक और ब्लॉक का उपयोग करना अधिक सुविधाजनक है क्योंकि आपको इस तरह के सरल कार्य के लिए पूरी नई विधि बनाने की आवश्यकता नहीं है, और क्या बढ़िया है, आप ब्लॉक चर के दायरे के भीतर प्रत्येक चर का उपयोग कर सकते हैं। – Johnnywho

5
dispatch_async(jsonQueue, ^{ 
     [self doSomeJSON]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
      //Finished with async block 

     }); 
    }); 
+0

मैंने इसे वोट दिया क्योंकि यह भी सही उत्तर है लेकिन दुर्भाग्य से ऊपर दिए गए व्यक्ति को थोड़ी अतिरिक्त जानकारी के साथ उत्तर दिया गया है। लेकिन बहुत बहुत धन्यवाद! – jimbob

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