8

別のスレッドで NSStream を使用してサーバーに接続するアプリケーションがあります。また、ユーザーがログアウトすることを決定した場合、アプリケーションは接続を閉じます。問題は、ユーザーが切断したときにストリームまたはスレッドを正常に閉じることができないことです。以下は、ネットワークのスレッドを作成し、ストリームを閉じようとする方法のコード サンプルです。

+ (NSThread*)networkThread
{
    static NSThread *networkThread = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        networkThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkThreadMain:) object:nil];

        [networkThread start];
    });

    return networkThread;
}

+ (void)networkThreadMain:(id)sender
{
    while (YES)
    {
        @autoreleasepool {
            [[NSRunLoop currentRunLoop] run];
        }
    }
}

- (void)scheduleInThread:(id)sender
{
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    [inputStream open];
}

- (void)closeThread
{    
    [inputStream close];
    [inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    [inputStream release];
    inputStream = nil;
}

入力ストリームに接続しようとしたときに行われた呼び出し:

[self performSelector:@selector(scheduleInThread:) onThread:[[self class] networkThread] withObject:nil waitUntilDone:YES];

どんなアドバイスでも大歓迎です。

4

1 に答える 1