多点连接 - 状态不变

Posted

技术标签:

【中文标题】多点连接 - 状态不变【英文标题】:Multipeer Connectivity - State Not Changing 【发布时间】:2014-01-26 21:06:37 【问题描述】:

我正在开发一个使用 Multipeer Conectivity Framework 的应用程序。到目前为止一切都很好,我已经实现了程序化浏览和邀请。

我的问题是当用户接受邀请时,浏览器没有收到状态更改 - 因此没有创建会话。

这是广告商确实收到了我使用与块集成的操作表创建的邀请方法。

    - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser
didReceiveInvitationFromPeer:(MCPeerID *)peerID
       withContext:(NSData *)context
 invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler


    [UIActionSheet showInView:self.view
                    withTitle:[[NSString alloc]initWithFormat:@"%@ would like to share %@ information with you.",peerID.displayName, (NSString *)context]
            cancelButtonTitle:@"Cancel"
       destructiveButtonTitle:@"Deny"
            otherButtonTitles:@[@"Accept"]
                     tapBlock:^(UIActionSheet *actionSheet, NSInteger buttonIndex) 
                         NSLog(@"%i",buttonIndex==1?true:false);
                         MCSession *newSession=[[MCSession alloc]initWithPeer:[[MCPeerID alloc] initWithDisplayName:@"CRAP23456"]];
                         [newSession setDelegate: self];
                         NSLog(@"button index %i ",buttonIndex==1?true:false);
                         invitationHandler(buttonIndex==1?YES:NO,newSession);
                     ];

正在调用上述方法,并且邀请处理程序正在返回正确的值。

我在浏览器端的实现非常简单 - 这是当用户接受/拒绝该方法时应该调用的方法。但是,只有在用户拒绝邀请时才会调用它:

 - (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state

    NSLog(@"%d",state);
    NSLog(@"%ld",(long)MCSessionStateConnected);

提前致谢。

詹姆斯。

【问题讨论】:

【参考方案1】:

我希望其中一项对您有所帮助:

实现session:didReceiveCertificate:fromPeer:certificateHandler: 我读到here 说这是必要的。

保持两个同行之间的浏览和广告单向交易;也就是说,如果两端都在浏览,则不要接受两端的邀请(至少不要接受邀请并通过您在 invitationHandler() 中浏览的同一会话)。

将您的代码包装在 didChangeState 块中,如下所示: dispatch_async(dispatch_get_main_queue(), ^ NSLog(@"%d",state); NSLog(@"%ld",(long)MCSessionStateConnected); );

【讨论】:

【参考方案2】:

我也遇到过这个问题。我在浏览器端的代码如下所示:

MCSession *session = [[MCSession alloc] initWithPeer:[self peerID]];
session.delegate = self;
[browser invitePeer:peerID toSession:session withContext:nil timeout:30.0f];

问题在于浏览器不保留对会话的引用,因此 ARC 会在另一端有机会接受之前出现并清理它。

将其更改为以下解决了该问题:

_session = [[MCSession alloc] initWithPeer:[self peerID]];
_session.delegate = self;
[browser invitePeer:peerID toSession:_session withContext:nil timeout:30.0f];

.. _session 是我班上的 ivar。

HTH

【讨论】:

感谢您提出此类问题。事实证明,浏览器和广告商也存在问题。一旦我对它们进行了 ARC 持久引用,系统就开始工作了。

以上是关于多点连接 - 状态不变的主要内容,如果未能解决你的问题,请参考以下文章

不变模式-类行为型

Simulink Stateflow:向状态添加不变量

《JAVA与模式》之不变模式

设计模式-不变模式

NGXS 状态不变

了解什么是不变模式