これは runLoop または ExternalAccessories の問題ではありません。これは日常的な OOP 問題です。
最善の方法は、outputStream に書き込み、応答を待機できる Communication オブジェクトを作成することです。これを行うには @protocols を使用してください。(イベントリスナー主導の手続き)
これを試して:
まず、入出力ストリームを runLoop にアタッチする必要があります。
[[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[[session inputStream] open];
[[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[[session outputStream] open];
彼らの代理人になります:
[[session outputStream] setDelegate:self];
[[session inputStream] setDelegate:self];
デリゲートになったら、このメソッドを実装する必要があります。
-(void)stream:handleEvent:{};
これは、データをストリームに書き出すコマンドです。
/* data is a NSData containing data to transmit. */
[[session outputStream] write:(uint8_t *)[data bytes] maxLength:[data length]];
これはコードの例です (セッションを作成したら、予想される答えはバイトです):
Comm.h:
/* Define your protocol */
@protocol CommDelegate <NSObject>
-(void)byteReceived: (char) byte;
@end
@interface Comm <NSObject> {
[...]
id<CommDelegate> delegate;
}
@end
@property (nonatomic, retain) id<CommDelegate> delegate;
Comm.m:
@implementation Comm
[...]
-(id)init {
[...]
delegate = nil;
[...]
}
-(void)write: (NSData *) data {
[[session outputStream] write:(uint8_t *)[data bytes] maxLength:[data length]];
}
-(void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)_event {
switch (_event)
{
case NSStreamEventHasBytesAvailable:
/* This part will be executed every time your rx buffer contains at least 1 byte */
switch(state) {
uint8_t ch;
/* Read byte per byte */
[stream read:&ch maxLength:1];
/* now ch contains a byte from your MFI device
** and 'read' function decrease the length of the rx buffer by -1 */
/* Now you can notify this to the delegate
*/
if(self.delegate != nil)
[delegate byteReceived: ch];
}
break;
}
}
your_app_controller.h:
@interface MyApp : UIViewController <CommDelegate> {
Comm comm;
}
@end
your_app_controller.m:
@implementation MyApp
-(id)init {
[...]
comm = [[Comm alloc] init];
[comm setDelegate: self]; /* Now your thread is listening your communication. */
}
-(void)write {
byte out = 'X';
[comm write: [NSData dataWithBytes: &out length: 1]];
}
-(void)bytereceived:(char)reply {
if(reply == 'Y') {
[self write];
//[self performSelectorInBackground:@selector(write) withObject:nil]; IT'S BETTER!!!
}
}
@end
お役に立てれば!