में तुल्यकालिक बारी मैं एक async एपीआई कि इस तरह दिखना रैप करने के लिए करना चाहते हैं:कैसे एक अतुल्यकालिक विधि है कि एक ब्लॉक लेता लपेट और यह उद्देश्य सी
[someObject completeTaskWithCompletionHandler:^(NSString *result) {
}];
एक तुल्यकालिक विधि में है कि मैं इस
की तरह कॉल कर सकते हैंNSString *result = [someObject completeTaskSynchronously];
मैं यह कैसे कर सकता हूं?
-(NSString *) completeTaskSynchronously {
__block NSString *returnResult;
self.semaphore = dispatch_semaphore_create(0);
[self completeTaskWithCompletionHandler:^(NSString *result) {
resultResult = result;
dispatch_semaphore_signal(self.semaphore);
}];
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
return resultResult;
}
लेकिन यह does not काम करने के लिए, यह मूल रूप से सिर्फ dispatch_semaphore_wait पर रोक लग रहे: मैं कुछ दस्तावेज़ पढ़ने और गूगल खोज, और "dispatch_semaphore" का उपयोग करने के लिए क्या करने की कोशिश तो की तरह इसे प्राप्त करने की कोशिश की थी। निष्पादन ब्लॉक के अंदर कभी नहीं पहुंचता है जो _signal करता है। किसी के पास कोड उदाहरण है कि यह कैसे करें? मुझे संदेह है कि ब्लॉक को मुख्य थ्रेड के अलावा एक अलग थ्रेड पर होना चाहिए? साथ ही, मान लीजिए कि मेरे पास async विधि के पीछे स्रोत कोड तक पहुंच नहीं है। धन्यवाद!
पूरा होने हैंडलर एक ही धागा कॉल dispatch_semaphore_wait आप वास्तव में धागा गतिरोध क्योंकि पूरा होने के ब्लॉक प्रतीक्षा से धागा बाहर निकलता है जब तक क्रियान्वित नहीं किया जा सकता है पर निष्पादित किया जाता है। क्या आप इसे मुख्य धागे पर करने की कोशिश कर रहे हैं? लंबे समय तक मुख्य धागे को अवरुद्ध करना बेहतर नहीं है क्योंकि इसे लगातार संदेशों को प्रेषित करना होगा। – yurish
यदि, @yurish द्वारा संदिग्ध होने के नाते, आप हैंडलर को मुख्य प्रेषण धागे पर कतारबद्ध किया गया है, तो आपको प्रतीक्षा नहीं करनी चाहिए। आपको राज्य कोड के रूप में अपना कोड प्रवाह बनाना होगा और पूरा होने वाले हैंडलर के परिणामस्वरूप जो कुछ भी करने की आवश्यकता है, उसे करना होगा। –
ऐसा करने का कोई सामान्य तरीका नहीं है। जैसा कि अन्य ने कहा है, अगर एसिंक्रोनस कार्य का कुछ हिस्सा रन लूप पर ईवेंट डालने से काम करता है, तो आप हमेशा डेडलॉक करेंगे। आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं? शायद आपके कोड को ढूढ़ने का एक और तरीका है। – JeremyP