线程安全-一个VC下多个网络请求
一、线程安全变量控制显示隐藏loading框
问题描写叙述:
同一页面有两个异步网络请求,第一个请求開始,loading旋转。第二个请求開始loading旋转。第一个结束,loading停止旋转,但是这时第二个请求还没有结束。然后loading就结束了,于是问题就来了。
解决方式:
二、由上面问题引申出的问题:
1.
#import <libkern/OSAtomic.h>
这段话是从网上copy过来的。总结了一下原子操作的作用。
可是文中提到的osbase.h文件找不到。可能是由于版本号升级我的lib中没有这个文件。
iOS平台下的原子操作函数都以OSAtomic开头,使用时须要包括头文件<libkern/OSBase.h>。不同线程假设通过原子操作函数对同一变量进行操作,可以保证一个线程的操作不会影响到其它线程内对此变量的操作。由于这些操作都是原子式的。
由于原子操作仅仅能对内置类型进行操作。所以原子操作可以同步的线程仅仅能位于同一个进程的地址空间内。
转载请说明下:谢谢了。
点击打开链接(http://blog.csdn.net/a21064346/article/details/8076972)
单例方式1:
- + (ABAddressBook *) sharedAddressBook
- {
- static ABAddressBook * volatile __shared = nil;
- if ( __shared == nil )
- {
- ABAddressBook * tmp = [[ABAddressBook alloc] init];
- if ( OSAtomicCompareAndSwapPtr(nil, tmp, (void * volatile *)&__shared) == false )
- [tmp release];
- }
- return ( __shared );
- }
上面一段代码是创建一个 ABAddressBook的单例,为了保证在调用shareAddressBook的时候。内存中仅仅有一个且内存地址唯一(也就是说,怕其它线程訪问到这个函数,同一时候进行訪问这个单例)
volatile的作用是每次取得数值得方式是直接从内存中读取。
单例方式2:
- + (ILSCMPersistenceManage *)sharedInstance {
- @synchronized ([ILSCMPersistenceManage class]) {
- if (__sharedInstance) {
- return __sharedInstance;
- }
- __sharedInstance = [[ILSCMPersistenceManage alloc] init];
- return __sharedInstance;
- }
- }
二者差别:
前者:更区域数据的底层,从更深层来进行对单例的保护,并且不不过作用于指针,还有其它的数据格式。并且它并没有去阻断其它线程来对函数的訪问
后者:加锁。对代码的运行效率与前者相比要低一些。假设运用在其它数据,而这个数据被更新的速度非常快,那么效率就非常差了。
參考与学习:
1、http://southpeak.github.io/blog/2014/10/17/osatomicyuan-zi-cao-zuo/
2、http://www.cocoachina.com/industry/20130821/6842.html
3、http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/
2.OSAtomic vs OSAtomicBarrier
On Intel and uniprocessor platforms, it doesn't matter.
For multiprocessor PPC systems, you should always use the barrier variety of functions, unless the atomic store affects no dataother than the atomic variable.
The following would not be ok:
data_structure[y].data++;
OSAtomicIncrement32(y);
You must use a barrier here, because other threads may see data_structure as out of date.
However, if you are using an atomic variable for some purpose where it stands alone, you may omit the barrier:
// y is not used to access any other data
OSAtomicIncrement32(y);
Fine, as long as the value of y does not affect the variable of any shared data structure.
Essentially, it's a cache flush. You can always safely use the barrier functions, but in some cases, you may be able to improve performance by not using the barrier functions, such as if y is not used relative to
a data structure. There are probably not many cases where you can use the functions without the barrier.
3.int int32_t int64_t
这些事跨平台编程导致的;
一、数据类型特别是int相关的类型在不同位数机器的平台下长度不同。 C99标准并不规定详细数据类型的长度大小。仅仅规定级别。作下比較: 16位平台 char 1个字节8位 short 2个字节16位 int 2个字节16位 long 4个字节32位 指针 2个字节 32位平台 char 1个字节8位 short 2个字节16位 int 4个字节32位 long 4个字节 long long 8个字节 指针 4个字节 64位平台 char 1个字节 short 2个字节 int 4个字节 long 8个字节(差别) long long 8个字节 指针 8个字节(差别) 二、编程注意事项 为了保证平台的通用性。程序中尽量不要使用long数据库型。能够使用固定大小的数据类型宏定义: typedef signed char int8_t typedef short int int16_t; typedef int int32_t; # if __WORDSIZE == 64 typedef long int int64_t; # else __extension__ typedef long long int int64_t; #endif 三、使用int时也能够使用intptr_t来保证平台的通用性,它在不同的平台上编译时长度不同。但都是标准的平台长度,比方64位机器它的长度就是8字节,32位机器它的长度是4字节,定义例如以下: #if __WORDSIZE == 64 typedef long int intptr_t; #else typedef int intptr_t; #endif 编程中要尽量使用sizeof来计算数据类型的大小 以上类型定义都有对应的无符号类型。 另外还有ssize_t和size_t各自是sign size_t和unsigned signed size of computer word size。它们也是表示计算机的字长,在32位机器上是int型,在64位机器上long型,从某种意义上来说它们等同于intptr_t和 须要注意的是socket的accept函数在有些操作系统上使用size_t是不对的,由于 accept接收的int*类型。而size_t可能是long |
uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型
在nesc的代码中。你会看到非常多你不认识的数据类型,比方uint8_t等。咋一看,好像是个新的数据类型,只是C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?非常多人有这种疑问。论坛上就有人问:以*_t结尾的类型是不是都是long型的?在baidu上查一下,才找到答案,这时才发觉原来自己对C掌握的太少。
那么_t的意思究竟表示什么?详细的官方答案没有找到,只是我认为有个答案比較接近。它就是一个结构的标注,能够理解为type/typedef的缩写,表示它是通过typedef定义的。而不是其他数据类型。
uint8_t。uint16_t,uint32_t等都不是什么新的数据类型,它们仅仅是使用typedef给类型起的别名。新瓶装老酒的把戏。
只是,不要小看了typedef。它对于你代码的维护会有非常好的作用。
比方C中没有bool,于是在一个软件中,一些程序猿使用int。一些程序猿使用short。会比較混乱,最好就是用一个typedef来定义。如:
typedef char bool;
一般来说,一个C的project中一定要做一些这方面的工作,由于你会涉及到跨平台。不同的平台会有不同的字长,所以利用预编译和typedef能够让你最有效的维护你的代码。为了用户的方便,C99标准的C语言硬件为我们定义了这些类型,我们放心使用就能够了。
依照posix标准。一般整形相应的*_t类型为:
1字节 uint8_t
2字节 uint16_t
4字节 uint32_t
8字节 uint64_t
线程安全-一个VC下多个网络请求的更多相关文章
- # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#
Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...
- 造轮子 | 怎样设计一个面向协议的 iOS 网络请求库
近期开源了一个面向协议设计的网络请求库 MBNetwork,基于 Alamofire 和 ObjectMapper 实现,目的是简化业务层的网络请求操作. 须要干些啥 对于大部分 App 而言,业务层 ...
- C#反射の一个泛型反射实现的网络请求框架
点击下载源码 C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转)
- 网络请求怎么样和UI线程交互? Activity2怎么通知Activity1 更新数据
1.网络请求怎么样和UI线程交互? 目前我的做法是,建立线程池管理网络请求线程,通过添加task来新增网络请求.所有的网络操作通过统一的request来实现,网络返回结果通过回调onError和onS ...
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式
今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小案例,希望对大家有所帮助,效果图: Retrofit是Square公司开发 ...
- AndroidInject项目使用动态代理增加对网络请求的支持
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3540427.html AndroidInject项目是我写的一 ...
- ios编程之网络请求
网络请求有GET请求和POST请求,get和post实现的时候可以选择同步或者异步实现.看一个请求是GET还是POST就看网址后面有没有携带请求体. GET与POST 区别 1.get请求 请求的网 ...
- Android中的异步网络请求
本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关姿势.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家:) 1. 同步网络 ...
- Android网络请求心路历程
HTTP请求&响应 既然说从入门级开始就说说Http请求包的结构.一次请求就是向目标服务器发送一串文本.什么样的文本?有下面结构的文本.HTTP请求包结构 例子: 1 2 3 4 5 6 7 ...
随机推荐
- Ubuntu下安装anaconda和pycharm
折腾了一上午,终于装好了,如下:Python环境的安装: 安装anaconda 建议去https://www.anaconda.com/download/#linux直接用Ubuntu界面的搜狐浏览器 ...
- spring boot + activeMq 邮件服务
引入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- day01_05.数学运算符
数学运算符 $zhang = 100; $lisi = 50; echo $zhang+$lisi; 答案:150 $zhang = 50; $lisi = 40; echo $zhang - $li ...
- 【转载】用OCTAVE实现一元线性回归的梯度下降算法
原文地址:http://www.cnblogs.com/KID-XiaoYuan/p/7247481.html STEP1 PLOTTING THE DATA 在处理数据之前,我们通常要了解数据,对于 ...
- 解决webstorm安装babel卡死问题
2017.07.16 现在大家可以直接使用yarn的方式安装包,可以解决babel目录过长导致webstorm卡死的问题. yarn的安装不会执行组件命令就不会导致node_modules下面继续嵌套 ...
- Swift UI控件详细介绍(上)
UI控件 首先介绍一下AppDelegate.swift@UIApplicationMain 调用了OC中的UIApplicationMain函数:UIApplicationMain是iOS应用程序的 ...
- 在 Ubuntu 16.04 上安装 Eclipse Oxygen
2017 年 6 月 28 日,Eclipse 社区(the Eclipse Community)发布了 Eclipse Oxygen.本文记录了我在 Ubuntu 16.04 上安装 Eclipse ...
- ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)
Problem D: (ds:树)合并果子 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 80 Solved: 4 [Submit][Status][ ...
- BZOJ3196 二逼平衡树 【线段树套平衡树】
题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在区间内的前驱(前驱 ...
- BZOJ4566 [Haoi2016]找相同字符 【后缀数组】
题目 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. 输入格式 两行,两个字符串s1,s2,长度分别为n1,n2.1 & ...