一、线程安全变量控制显示隐藏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:

  1. + (ABAddressBook *) sharedAddressBook
  2. {
  3. static ABAddressBook * volatile __shared = nil;
  4. if ( __shared == nil )
  5. {
  6. ABAddressBook * tmp = [[ABAddressBook alloc] init];
  7. if ( OSAtomicCompareAndSwapPtr(nil, tmp, (void * volatile *)&__shared) == false )
  8. [tmp release];
  9. }
  10. return ( __shared );
  11. }

上面一段代码是创建一个 ABAddressBook的单例,为了保证在调用shareAddressBook的时候。内存中仅仅有一个且内存地址唯一(也就是说,怕其它线程訪问到这个函数,同一时候进行訪问这个单例)

volatile的作用是每次取得数值得方式是直接从内存中读取。

单例方式2:

  1. + (ILSCMPersistenceManage *)sharedInstance {
  2. @synchronized ([ILSCMPersistenceManage class]) {
  3. if (__sharedInstance) {
  4. return __sharedInstance;
  5. }
  6. __sharedInstance = [[ILSCMPersistenceManage alloc] init];
  7. return __sharedInstance;
  8. }
  9. }

二者差别:

前者:更区域数据的底层,从更深层来进行对单例的保护,并且不不过作用于指针,还有其它的数据格式。并且它并没有去阻断其它线程来对函数的訪问

后者:加锁。对代码的运行效率与前者相比要低一些。假设运用在其它数据,而这个数据被更新的速度非常快,那么效率就非常差了。

參考与学习:

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和
uintptr_t。它们在stddef.h里面定义。

须要注意的是socket的accept函数在有些操作系统上使用size_t是不对的,由于 accept接收的int*类型。而size_t可能是long
int 类型。后来BSD使用sock_t来替代它。

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下多个网络请求的更多相关文章

  1. # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#

    Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...

  2. 造轮子 | 怎样设计一个面向协议的 iOS 网络请求库

    近期开源了一个面向协议设计的网络请求库 MBNetwork,基于 Alamofire 和 ObjectMapper 实现,目的是简化业务层的网络请求操作. 须要干些啥 对于大部分 App 而言,业务层 ...

  3. C#反射の一个泛型反射实现的网络请求框架

    点击下载源码 C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转)

  4. 网络请求怎么样和UI线程交互? Activity2怎么通知Activity1 更新数据

    1.网络请求怎么样和UI线程交互? 目前我的做法是,建立线程池管理网络请求线程,通过添加task来新增网络请求.所有的网络操作通过统一的request来实现,网络返回结果通过回调onError和onS ...

  5. kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式

    今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小案例,希望对大家有所帮助,效果图: Retrofit是Square公司开发 ...

  6. AndroidInject项目使用动态代理增加对网络请求的支持

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3540427.html AndroidInject项目是我写的一 ...

  7. ios编程之网络请求

    网络请求有GET请求和POST请求,get和post实现的时候可以选择同步或者异步实现.看一个请求是GET还是POST就看网址后面有没有携带请求体. GET与POST 区别  1.get请求 请求的网 ...

  8. Android中的异步网络请求

    本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关姿势.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家:) 1. 同步网络 ...

  9. Android网络请求心路历程

    HTTP请求&响应 既然说从入门级开始就说说Http请求包的结构.一次请求就是向目标服务器发送一串文本.什么样的文本?有下面结构的文本.HTTP请求包结构 例子: 1 2 3 4 5 6 7 ...

随机推荐

  1. Spring核心技术(十三)——环境的抽象

    本章将描述一下Spring中针对环境的抽象. Environment是一个集成到容器之中的特殊抽象,它针对应用的环境建立了两个关键的概念:profile和properties. profile是命名好 ...

  2. linux的vi和vim编辑器操作

    vi:linux内部的文本编辑器:vim:vi的增强版,具有程序编辑的能力. vi和vim的三种常见模式: (1)正常模式(一般模式):vim一打开就是这种模式,此模式下可以使用各种快捷键,比如复制粘 ...

  3. luogu2153 [SDOI2009]晨跑

    要想限制流量,总要想着拆点. #include <iostream> #include <cstring> #include <cstdio> #include & ...

  4. jquery如何获取某一个兄弟节点

    $('#id').siblings() 当前元素所有的兄弟节点 $('#id').prev() 当前元素前一个兄弟节点 $('#id').prevaAll() 当前元素之前所有的兄弟节点 $('#id ...

  5. 创建sql作业(JOB)

    在SQL Server日常需求处理中,会遇到定时执行或统计数据的需求,这时我们可以通过作业(JOB)来处理,从而通过代理的方式来实现数据的自动处理.一下为SQL Server中创建作业的脚本,供大家参 ...

  6. [python学习篇][系统学习][1]python标准库中文、英文网址(一些内建函数,标准库都可以在这里查找)

    http://docspy3zh.readthedocs.io/en/latest/library/   半中文网址 http://usyiyi.cn/translate/python_278/lib ...

  7. picPick使用研究

    WhiteBoard白板功能很强大. 可以直接在网页上进行圈画,然后截图. ImageEditor是一个很好用的画图功能,比windows画图的箭头好看.

  8. PHP杂技(二)

    php array_merge($a,$b)与 $a+$b区别 array_merge 数字键名会被重新编号,what's '...' $data = [[1, 2], [3], [4, 5]]; v ...

  9. Linux Shell系列教程之(十一)Shell while循环

    本文是Linux Shell系列教程的第(十一)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上一篇Linux Shell系列教程之(十)Shell for循环中,我们已经 ...

  10. ubuntu服务器与本地文件传输

    ubuntu SSH 连接.远程上传下载文件 博客分类: Ubuntu   安装 SSH(Secure Shell) 服务以提供远程管理服务 sudo apt-get install ssh SSH ...