0

ネットワークメッセージのバックグラウンドスレッドを作成するアプリケーションがあります。アプリケーションは、接続先のサーバーが接続を閉じない限り、ほぼ完全に機能します。なぜこれが起こるのかわかりませんが、アドバイスをいただければ幸いです。問題を追跡できるコードのスニペットを含めました。あいまいな点や詳細が必要な場合はお知らせください。

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
switch(eventCode) {
    case NSStreamEventErrorOccurred:
        {
            NSLog(@"NSStreamEventErrorOccurred");

            [self Disconnect:self];
        }
    }
}

- (void)Disconnect:(id)sender {
    [self performSelector:@selector(closeThread) onThread:[[self class]networkThread] withObject:nil waitUntilDone:YES];

    [outputStream close];
    [outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream release];
    outputStream = nil;
}

+ (NSThread*)networkThread
{
    // networkThread needs to be static otherwise I get an error about a missing block type specifier
    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;
}

ハングアップは、returnnetworkThread行で発生します。その行を実行した後、アプリケーションがハングしてフリーズしているように見え、その理由に指を置くことができません。

前もって感謝します。

編集

興味のある方のためのCloseThreadのコードスニペットは次のとおりです

- (void)closeThread
{   
    /*if(!inputStream)
        return;

    [inputStream close];
    [inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    [inputStream release];
    inputStream = nil;*/
}
4

1 に答える 1

1

変更することをお勧めします:

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

に:

[self PerformSelector:@selector(closeThread)onThread:[[self class] networkThread] withObject:nil waitUntilDone:NO];

つまり、待たないでください。

于 2012-09-19T23:46:44.270 に答える