2010-07-27 15 views
8

साथ performSelectorOnMainThread मैं निम्न विधि है:iphone - वापसी मान

- (NSMutableArray *)getElements:(NSString *)theURL; 

और मैं अगर वहाँ एक तरीका है कि विधि का उपयोग कर performSelectorOnMainThread कॉल करने के लिए इतना है कि मैं वापसी मान प्राप्त कर सकते हैं जानना चाहता था। अब तक, मैं के साथ की कोशिश की है:

myArray = [object performSelectorOnMainThread:@selector(getElements:) 
            withObject:url waitUntilDone:YES]; 

लेकिन यह काम नहीं करता है, के बाद से performSelectorOnMainThread शून्य देता है। मैं इसे कैसे हल कर सकता हूं?

उत्तर

12

मेरे मित्र के बहु-थ्रेडेड वातावरण में आपका स्वागत है।

आप एक उदाहरण चर में वापसी मान की दुकान या withObject पैरामीटर के माध्यम से संदर्भ द्वारा एक वस्तु में उत्तीर्ण होना होगा:

NSMutableDictionary *myDict; 

[object performSelectorOnMainThread:@selector(getElements:) 
            withObject:&myDict waitUntilDone:YES]; 

आपका विधि प्रोटोटाइप अब इस तरह दिखना चाहिए:

- (void)getElements:(NSMutableDictionary **)objects; 
+5

इस के साथ संकलित करने के लिए विफल रहता है: – eodabash

3

आप क्योंकि, जैसा कि आप कहते हैं, कि विधि शून्य देता है, सीधे यह नहीं कर सकते।

तो, आपको मूल्य वापस पाने के लिए एक और तरीका व्यवस्थित करना होगा, उदाहरण के लिए एनएसएसटींग के बजाय एनएस डिक्शनरी पास करके, और विधि को आपके लिए शब्दकोश में परिणाम संग्रहित करना होगा।

2

हाल ही में इसे लागू करना था। NSObject करने के लिए एक श्रेणी को जोड़ तो अपने सभी वस्तुओं को यह कर सकते हैं कि के लिए महान उम्मीदवार:

@implementation NSObject (CallSelectorWithObjectOnMainThread) 
- (id)resultFromSelectorOnMainThread:(SEL)selector object:(id)object { 
    NSMutableDictionary *resultDictionary = [NSMutableDictionary dictionaryWithCapacity:1]; 
    NSMutableDictionary *callDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:resultDictionary, @"ResultDictionary", NSStringFromSelector(selector), @"Selector", nil]; 
    if(object) [callDict setValue:object forKey:@"Object"]; 
    [self performSelectorOnMainThread:@selector(callObject:) withObject:callDict waitUntilDone:YES]; 
    return [resultDictionary objectForKey:@"Result"]; 
} 

- (void)callObject:(NSMutableDictionary *)info { 
    id result; 
    SEL selector = NSSelectorFromString([info objectForKey:@"Selector"]); 
    id object = [info objectForKey:@"Object"]; 
    NSMutableDictionary *resultDictionary = [info objectForKey:@"Dictionary"]; 
    if(object) 
    result = [self performSelector:selector withObject:object]; 
    else 
    result = [self performSelector:selector]; 
    if(result) 
    [resultDictionary setValue:result forKey:@"Result"]; 
} 
@end 
+0

+1 इस कॉलिन के लिए धन्यवाद "प्रकार 'NSMutableDictionary **' का एक rvalue साथ प्रकार 'आईडी' की एक पैरामीटर प्रारंभ नहीं किया जा सकता"। मुझे इसका उपयोग करने के बाद कुछ दोष मिले: कॉलडिक्ट को एनएसएमयूटेबल डिक्शनरी के साथ शुरू करने की आवश्यकता है और कॉलऑब्जेक्ट को एनएसएमयूटेबल डिक्शनरी तर्क की आवश्यकता है। – TPoschel

+0

@TPoschel धन्यवाद! – Colin

2

मैं किसी भी थ्रेड के लिए वापसी मान के साथ async अवरुद्ध कॉल के लिए सार्वभौमिक समाधान है, न केवल मुख्य। withObject: waitUntilDone: performSelectorOnMainThread की तरह मुख्य थ्रेड के लिए यह उदाहरण

__block id result = nil; 
NSOperationQueue* targetQueue = [NSOperationQueue* mainQueue]; 
// targetQueue is main thread, but it may be queue on any thread. 

[targetQueue addBlockOperation:^{ 
    // performs on target thread. 
    result = [someObject someSelector]; 
}]; 

// wait until operations on targetQueue will finished. 
[targetQueue waitUntilAllOperationsAreFinished]; 

// result is ready here. 

मैं केवल एआरसी वातावरण में इस तकनीक का इस्तेमाल किया।

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