外部附件流在100%的时间内不起作用

时间:2014-03-04 17:33:11

标签: ios objective-c sockets nsstream external-accessory

输入和输出流始终打开,并使用正确的NSStreamEvent代码(NSStreamEventOpenCompleted)调用相应的委托方法。但是,在某些openSession尝试流成功打开但它们不起作用。有时我只能写入输出流,但我无法从输入流中读取。有时我不会读或写。

有没有人遇到过这个问题,或者知道为什么会这样?任何帮助表示赞赏。感谢。

以下是一些相关代码

- (BOOL)openSession
{
    _session = [[EASession alloc] initWithAccessory:_selectedAccessory
                                        forProtocol:_protocolString];

    if (!_session)
        return false;

    [_selectedAccessory setDelegate:self];
    [[_session inputStream] setDelegate:self];
    [[_session outputStream] setDelegate:self];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {

        [[_session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                          forMode:NSDefaultRunLoopMode];
        [[_session inputStream] open];

        [[_session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                           forMode:NSDefaultRunLoopMode];
        [[_session outputStream] open];

        [[NSRunLoop currentRunLoop] run];
    });

    return true;
}

- (void)setupControllerForAccessory:(EAAccessory *)accessory withProtocolString:(NSString *)protocolString
{
    _selectedAccessory = accessory;
    _protocolString = [protocolString copy];
}

/**
 * There is something weird happening here too, this always get called twice when an accessory
 * gets connected. Once without a protocol string and once with a protocol string. I just
 * ignore the one without a protocol string.
 */
- (void)accessoryConnected:(NSNotification *)notification
{
    EAAccessory *connectedEA = [notification.userInfo objectForKey:@"EAAccessoryKey"];

    // Check to see if the connected EA has a protocol string
    if ([[connectedEA protocolStrings] count] == 0)
        return;

    [self setupControllerForAccessory:connectedEA
                   withProtocolString:[[connectedEA protocolStrings] objectAtIndex:0]];
    [self openSession];
}

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    switch (eventCode) {
        case NSStreamEventOpenCompleted:
            // This case always gets called twice, once for input and once for output
            NSLog(@"stream %@ opened", aStream);
            break;
        case NSStreamEventHasBytesAvailable:
            break;
        case NSStreamEventHasSpaceAvailable:
            break;
        case NSStreamEventErrorOccurred:
            break;
        case NSStreamEventEndEncountered:
            [self closeSession];
            break;
        default:
            break;
    }
}

- (void)closeSession
{
    [[_session inputStream] close];
    [[_session inputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [[_session inputStream] setDelegate:nil];

    [[_session outputStream] close];
    [[_session outputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [[_session outputStream] setDelegate:nil];

    _session = nil;
    _selectedAccessory = nil;
    _protocolString = nil;
}

1 个答案:

答案 0 :(得分:0)

我无法为你的问题添加评论(少点!)但我有一些提示,因为我的团队也面临同样的问题,这是使用流间歇性的。 我们已经向网络团队提出了一个错误。如果可能的话尝试记录错误,很可能你会收到一个错误" Stream意外结束"在调试器控制台中。这可能出现或可能不出现。

这是苹果文档中提供的类似代码,它也有同样的问题。 https://developer.apple.com/library/ios/samplecode/SimpleURLConnections/Listings/PostController_m.html#//apple_ref/doc/uid/DTS40009245-PostController_m-DontLinkElementID_12