Habber - IOS XMPP 客户端 教程 (终)总结与反思

折腾是一个过程,它从未间断


  1. 坑了我一晚上的框架视图,因为第三方的TSPopover没有在视图上正确弹出,而且console上提示“whose view is not in the window hierarchy”,遂查之,stackoverflow上的解决方案也没有用,怀疑过swift和OC并不能良好的匹配,怀疑过swift写的那个视图有问题,
    直到早上终于把问题确定在框架上,只见框架是这么加载视图的:

    [appWindow.rootViewController.view addSubview:self.view];
    

    而不是加载到我用segue跳转过来的子视图!而见上面有条注释掉的语句:

    [appWindow addSubview:self.view];
    

    而这才是我要加在子视图上的,也不知道作者为什么玩这个梗,随即把设置根视图的语句注
    释掉,上面的语句注释取消,视图可以正确显示了。

  2. 设置UITableView的颜色的时候,注意UITableView是最底层,上面就是cell,每个cell又是一个UIView,但是如果设置cell的背景色还不行,因为它还有上一层contentView,所以直接设置cell.contentView.backgroundColor才会有效果。

  3. It’s weird, 在swift中,或者在OC中没有试,设置button.titleLabel.text没有用,要用到button.setTitle(…)才行,仅仅一个label的区别,可是记得以前设置titleLabel有效的啊奇怪……

  4. Weird again, 我用代理,通知两种方式去执行同一种对界面的操作,代理能够有效的立即更新界面;但是用通知,里面NSLog执行的输出立马出来,但是界面的刷新很久才出来,好奇怪。

    2015-12-18 16:54:28.177 Habber[8168:238041] 代理-已认证
    2015-12-18 16:54:28.584 Habber[8168:238086] Warning: Attempt to present <UINavigationController: 0x7fdc0b0ab800> on <Habber.LoginViewController: 0x7fdc09ca0660> whose view is not in the window hierarchy!
    2015-12-18 16:54:28.584 Habber[8168:238086] 通知-已认证
    

    看到这就清楚了,代理在这个之前执行,可是怎么会造成not in the window hierarchy呢?
    因为说navigation上的东西不能显示在上一个视图上,于是我做了一个测试,在selector指向的function里加了个UIAlertView,看看能不能正常显示,但是没有正常显示出来。
    并且提示我:

    This application is modifying the autolayout engine from a background thread, 
    which can lead to engine corruption and weird crashes.  
    This will cause an exception in a future release.
    

    那么看原因就是在后台线程执行方法所以没有显示出来,那么既然知道了原因把方法的内容加在主线程里就是了:

        dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertView *test = [[UIAlertView alloc] 
            delegate:nil cancelButtonTitle:@"OK" 
            otherButtonTitles:nil, nil];
            [test show];
            [self onlineSet];
        });
    

    这样就可以正常显示了,但是到底为什么不是在主线程里执行的?
    网上也没有搜过具体的答案,不过以后凡是设计到修改界面的就设置主线程运行吧。
    这里我就用delegate来实现对界面的操作,既然设置了代理不用白不用。
    但是为什么见鬼的不是在主线程里执行的?

    And here there’s a maybe solution:

    因为当时设置xmppStream在不同的线程,所以通知>的时候就会在不同的线程中通知然后执行selector指向的方法,我已经改成了主线程,at least it worked.
    
  5. 从下一级视图返回主视图,主视图的viewDidLoad每次都会运行嘛?

    答案是:不会!所以就有了viewDidAppear这个方法。
    
  6. 关于segue跳转页面过后,上一个页面是存在还是被回收?上面设置的通知监听是否还依然有效?

    经试验表明,只要接收到发出的通知,程序接收此通知的selector指向的方法都会执行!
    而且viewDidLoad并没有被再次加载,也表明了跳转过后上一级视图并没有被销毁。
    结果是推导出来的,试验也就在有上下级的两个视图试验过而已。
    
  7. 不要随便给xmppStream disconnect,否则监听到断流就会post notification,so that you will receive an alert view which you set prompt you CONNECTION FAIL!
  8. 在联系人列表的TableView中把cell连线给ChatViewController,发现当点击cell跳转后不能正确获取到聊天联系人的ID,通过NSLog调试后发现,原来prepareForSegue会比didSelectRowAtIndexPath要先执行,也就是说这里不能从cell中直接拖线出来,要从didSelected中执行performSegue才行。这也是以前我用swift写的时候一直没有解决的问题之一,现在豁然开朗。
  9. UIAlertView添加文本框

    UIAlertView* dialog = [[UIAlertView alloc] initWithTitle:@"Title" 
    message:@"" delegate:self cancelButtonTitle:@"Yes" 
    otherButtonTitles:@"No",nil];
    [dialog setAlertViewStyle:UIAlertViewStylePlainTextInput];
    

    这样就有了文本框的提示框。
    取得文本框并设置PlaceHolder:
    [[_addFriendWindow textFieldAtIndex:0] setPlaceholder:@"Friend ID here"];
    最后再用一个show调用alertView就好了。

  10. 跳了个大坑!
    加了个功能,添加好友,网上搜到一堆,大同小异,可是就不能够添加好友。
    初始化了XMPPRoster对象,发现它依赖XMPPStorage对象,于是便初始化了XMPPStorage的对象,还是不行,设置断点调试,未果,实在不行跑到xmpp框架自带的demo中去找,果然找到了关键!还需要激活xmppStream进行传输,于是加了一句
    [_xmppRoster activate:[[self getAppDelegate] xmppStream]];
    大功告成!

  11. 关于发送图片、声音文件需要转码的问题,搜了n多网页得以实现,用base64转字符串方式进行发送,但是这里有个地方要注意,虽然我用电脑创建无线热点让手机连接,发送图片和语音还是很慢,但是不知道是转码慢还是无线热点传输慢,传输数据需要等一会儿才能看见,这是一种数据转码发送大文件形式实现传输的。
    网上说还有一种快速的直接上传服务器,然后给客户端发送链接查看的会比较效率,但是这一点我还没有去研究。

    偶有所得,电脑发送给手机图片和语音的时候超级快,而手机发送给电脑的时候很慢,
    看来就是编码解码的问题了,毕竟手机的处理器弱。
    但是也说明了这种发送数据的方式太low了,现在的技术怎么可能允许传输这么慢、、
    another point,如果png格式的NSData数据编码对于iPhone这种高像素的手机来说,
    发送大数据的xml直接导致对方掉线。。。
    
  12. 经实验,代理不能够像广播通知那样,一次能够发送给多个接收者,代理只能发送给一个,谁最后指向的发送给谁,也就是最后.delegate = self 的那个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值