ここにあるコードを使用して、ソケットとストリームを使用して別のデバイスにメッセージを送信しようとしています。
http://mobileorchard.com/tutorial-networking-and-bonjour-on-iphone/
これは正常に機能し、あるデバイスからメッセージを送信し、別のデバイスにメッセージを受信させて問題なく読み取ることができます。NSDataなどの大きなメッセージでは、メッセージの送信中にUIがフリーズするため、バックグラウンドスレッドで実行したいと思います。私のコードは、バックグラウンドスレッドが実装されていることを除いて、同じように見えます。
dispatch_queue_t queue = dispatch_queue_create("com.App.SendMessage", NULL);
dispatch_async(queue, ^{
NSMutableDictionary *mutable = [[NSMutableDictionary alloc] init];
[mutable setObject:@"Test" forKey:@"TestKey"];
[self.server sendMessage:mutable toService:service];
});
dispatch_release(queue);
そして、メッセージングコードは次のようになります。
NSData* rawPacket = [NSKeyedArchiver archivedDataWithRootObject:packet];
// Write header: lengh of raw packet
int packetLength = [rawPacket length];
[outgoingDataBuffer appendBytes:&packetLength length:sizeof(int)];
// Write body: encoded NSDictionary
[outgoingDataBuffer appendData:rawPacket];
// Try to write to stream
[self writeOutgoingBufferToStream];
- (void)writeOutgoingBufferToStream {
// Is connection open?
if ( !readStreamOpen || !writeStreamOpen ) {
// No, wait until everything is operational before pushing data through
return;
}
// Do we have anything to write?
if ( [outgoingDataBuffer length] == 0 ) {
return;
}
// Can stream take any data in?
if ( !CFWriteStreamCanAcceptBytes(writeStream) ) {
return;
}
// Write as much as we can
CFIndex writtenBytes = CFWriteStreamWrite(writeStream, [outgoingDataBuffer bytes], [outgoingDataBuffer length]);
if ( writtenBytes == -1 ) {
// Error occurred. Close everything up.
[self close];
[delegate connectionTerminated:self];
return;
}
NSRange range = {0, writtenBytes};
[outgoingDataBuffer replaceBytesInRange:range withBytes:NULL length:0];
}
次のエラーでクラッシュします。
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSConcreteMutableData replaceBytesInRange:withBytes:length:]: range {0, 1855} exceeds data length 0'
なぜこれがバックグラウンドスレッドでクラッシュするのか誰かが知っていますか?