Я предоставляю клиентскую функцию обратного вызова в потоке сетевого чтения ниже:
-(void)connectToServer
{
if([self isServerConfigured])
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFHostRef host = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)self.serverAddress);
CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host, self.port, &readStream, &writeStream);
CFStreamClientContext myContext = {
0,
self,
(void *(*)(void *info))CFRetain,
(void (*)(void *info))CFRelease,
(CFStringRef (*)(void *info))CFCopyDescription
};
CFOptionFlags registeredEvents = kCFStreamEventHasBytesAvailable |
kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered;
if(CFReadStreamSetClient(readStream, registeredEvents, serverCB, &myContext))
{
CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
}
if(!CFReadStreamOpen(readStream)){
NSLog(@"Could not open read stream");
}
}
}
Я бы хотел, чтобы эта функция обратного вызова могла вызывать функции экземпляра в текущем объекте (self).Не похоже, что CFReadStreamSetClient позволит мне изменить сигнатуру функций обратного вызова, и поэтому я не могу просто передать ссылку на текущий объект в обратный вызов, я не думаю.
Это функция обратного вызова:
void serverCB(CFReadStreamRef stream, CFStreamEventType event, void *myPtr)
{
switch(event) {
case kCFStreamEventHasBytesAvailable:
[self readStreamData:stream];
break;
case kCFStreamEventErrorOccurred:
NSLog(@"A Read Stream Error Has Occurred!");
break;
case kCFStreamEventEndEncountered:
NSLog(@"A Read Stream Event End!");
break;
default:
break;
}
}
ServerCB не будет знать, что означает «я» в этом контексте.Может кто-нибудь дать мне указатель на то, как я могу обойти это?
Спасибо!