后台线程中的CFReadStreamClientCallBack

时间:2012-02-05 12:38:36

标签: iphone objective-c

在我的应用程序中,我在WiFi上打开一个服务器,用于共享文件并将文件从Web浏览器上传到应用程序。 我有一个问题,它在主线程(UI线程)上工作,并且它产生了很多问题,有一种方法可以使这个代码在后台工作吗?

这是代码:

我用这种方法使读取流非阻塞:

if (!CFReadStreamSetClient (theReadStream,
    kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered | kCFStreamEventOpenCompleted,
    (CFReadStreamClientCallBack)&MyCFReadStreamCallback,
    (CFStreamClientContext *)(&theContext) ))
{
    NSError *err = [self getStreamError];

    NSLog (@"AsyncSocket %p couldn't attach read stream to run-loop,", self);
    NSLog (@"Error: %@", err);

    if (errPtr) *errPtr = err;
    return NO;
}

并且它调用了这个方法:

    static void MyCFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo)
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        AsyncSocket *socket = [[(AsyncSocket *)pInfo retain] autorelease];
        [socket doCFReadStreamCallback:type forStream:stream];

        [pool release];
    }

这是我使用的源代码: http://code.google.com/p/cocoaasyncsocket/

1 个答案:

答案 0 :(得分:1)

使用如下代码生成后台线程:

bgThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadMain) object:nil];
[bgThread start];

并以'threadMain'方法启动服务器侦听器。

详细了解Threading Programming Guide

中的多线程