美文网首页
GCDAsyncSocket里拼接数据用主队列

GCDAsyncSocket里拼接数据用主队列

作者: 06f43b0b52f7 | 来源:发表于2018-05-22 14:54 被阅读12次

    self.serviceSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue: dispatch_get_main_queue()];
    不能用并发队列,(_appenddata是NSMutabledata是非线性安全类)
    // 非线程安全类
    // 以下这些类和函数通常被认为是非线程安全的。在大部分情况下,你可以在任何线程里面使用这些类,只要你在同一个时间只在一个线程里面使用它们。参考这些类对于的额外详细信息的文档。

    就是写入数据的时候,只能在一个线程里写,比如说,现在是3个字节,来了一个一个字节的数据数据,要写第4个字节,马上又来一个1个字节的数据,本来应该写入第5个字节,但是因为socket如果工作在并发线程,后面这个字节和前面这个字节是可能一起来的,反正是第4个字节还没有写完,这个时候,第5个字节数据拿到的mutabldata对象还是可能是原始的3个字节的那段,这样就同时在写第4个字节的数据,就冲突了。

    线程安全的类和函数

    下面这些类和函数通常被认为是线程安全的。你可以在多个线程里面使用它们的同一个实例,而无需获取一个锁。

    非线程安全类

    以下这些类和函数通常被认为是非线程安全的。在大部分情况下,你可以在任何线程里面使用这些类,只要你在同一个时间只在一个线程里面使用它们。参考这些类对于的额外详细信息的文档。

    注意,尽管NSSerializer,NSArchiver,NSCoder和NSEnumerator对象本身是线程安全的,但是它们被放置这这里是因为当它们封装的对象被使用的时候,更改这些对象数据是不安全的。比如,在归档情况下,修改被归档的对象是不安全的。对于一个枚举,任何线程修改枚举的集合都是不安全的。

    只能用于主线程的类

    以下的类必须只能在应用的主线程类使用。

    • NSAppleScript

    相关文章

      网友评论

          本文标题:GCDAsyncSocket里拼接数据用主队列

          本文链接:https://www.haomeiwen.com/subject/uighjftx.html