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