2011-01-18 7 views
5

पर माध्यमिक धागे के साथ AsyncSocket का उपयोग करना मैं सर्वर के साथ संवाद करने के लिए आईफोन पर AsyncSocket का उपयोग करता हूं। AsyncSocket रन लूप पर आधारित है लेकिन मेरा ऐप धागे पर आधारित है। इसका मतलब है, मैं डेटा लिखने के लिए एक नया धागा शुरू करता हूं और उसी थ्रेड पर प्रतिक्रिया प्राप्त होने तक प्रतीक्षा करता हूं।आईफोन

[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES]; 

यह काम करते हैं, लेकिन मुझे नहीं मेरी विधि "writeSomeData:" से प्रतिक्रिया प्राप्त कर सकते हैं करता है: लेकिन मैं एक और धागा से सीधे एक AsyncSocket की विधि कॉल नहीं कर सकता, मैं का उपयोग करने के इस तरह से कहा जाता है, क्योंकि performSelectorOnMainThread रिटर्न कुछ भी तो नहीं।

विधि writeSomeData: कुछ इस तरह है:

-(NSData *)writeData:(NSData *)dataToWrite { 
    dataReceived = nil; // AsyncSocket writes data to this variable 
    [asyncSocket writeData:dataToWrite withTimeout:-1 tag:0]; 
    [asyncSocket readDataToData:[@"<EOF" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; 
    int counter = 0; 
    while (dataReceived == nil && counter < 5) { 
     // runLoop is [NSRunLoop currentRunloop] 
     [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.3]]; 
     ++counter; 
    } 

    return [dataReceived copy]; 
} 

मैं कक्षा चर "dataReceived" तक पहुंच कर प्रतिक्रिया मिल सकता है, लेकिन यह सामग्री इस समय नहीं बदला है।

क्या कोई मुझे बता सकता है कि अलग थ्रेड पर AsyncSocket (या आम तौर पर, रन लूप आधारित कक्षाओं से कैसे निपटें) का उपयोग कैसे करें, ताकि यदि मैं उस वर्ग की विधि को कॉल करता हूं तो यह विधि तब तक अवरुद्ध हो जाता है जब तक विधि निष्पादित नहीं होती है और प्रतिक्रिया होती है प्राप्त किया?

धन्यवाद।

+1

क्यों आप पहली जगह में उस परिदृश्य चाहेगा? एक धागा क्यों बनाएं (प्रतीत होता है) पहली चीज जो आप करते हैं वह इसे अवरुद्ध कर देती है जब तक कि कुछ और अयस्क कम मनमानी भविष्य की तारीख न हो? क्यों थ्रेड से पूरी चीज को runloop से शुरू नहीं करें और 'NSOperationQueue' या वैश्विक समवर्ती' dispatch_queue 'पर प्रसंस्करण के लिए _result-data_ प्रेषित करें? – danyowdee

उत्तर

-1

एक अलग थ्रेड पर अपना डेटा लिखने के लिए GCD (ग्रैंड सेंट्रल डिस्पैच) का उपयोग करने का प्रयास करें और डेटा को लिखे गए पल के मुख्य थ्रेड पर वापस आने की कोशिश करें। आप इसे इस तरह कर सकता है:

// call this on the main thread 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    NSData *data = [self writeData:dataToWrite]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // do something with the data on the main thread. 
    }); 
}); 

मुझे आशा है कि कुछ इस तरह मदद कर सकता है ...