IOS NSOpertation和NSOperationQueue的使用

国产数据库安装部署说明 阅读详情
一 NSOperation简介
    
       NSOperation是IOS是实现程序并行的一种方法,它是在IOS实现多线程编程的重要的方式之一。其实它就是对线程的一种高度的抽象封装,如果我们熟悉Windows 编程的话这个NSOperation中定义的main方法就相当于线程函数,如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似。但是NSOperation做了更加高度的抽象,使用起来也更加的方便。

二 NSOperation的使用
 
首先介绍两种特殊的NSOperation :    NSInvocationOperation和NSBlockOperation

 NSInvocationOperation   用于调用一个对象内部的方法
 NSBlockOperation           用于封装一个代码块,执行一个代码块中的代码
其实这两个类的本质都是用来封装要进行异步执行的任务的,可以直接用一个方法也可以使用代码块

下面我们来看一个使用它们的例子:

.h文件
@interface WBViewController ()
@property(nonatomic,strong) NSInvocationOperation *simpleOperation;
@property(nonatomic,strong) NSBlockOperation  *blockOpertaion;
@end

.m文件
@implementation WBViewController
@synthesize simpleOperation = _simpleOperation;
@synthesize blockOpertaion  = _blockOpertaion;


- (void) simpleOperationEntry:(id) paramObject  {
   
 NSLog(@"Parameter Object = %@",paramObject);
   
 NSLog(@"Main Thread = %@",[NSThread mainThread]);
   
 NSLog(@"Current Thread = %@",[NSThread currentThread]);
}

调用代码
-(void) viewDidAppear:(BOOL)animated {

    NSNumber *simpleObject = [NSNumber numberWithInt:123];
   
 self.simpleOperation = [[NSInvocationOperation alloc] initWithTarget:self
                                                               
 selector:@selector(simpleOperationEntry:) 
                                                                  object:simpleObject];
    [
self.simpleOperation start];

    self.blockOpertaion = [NSBlockOperation blockOperationWithBlock:^{
   
       
 NSLog(@"Main Thread = %@",[NSThread mainThread]);
       
 NSLog(@"Current Thread = %@",[NSThread currentThread]);
       
       
 NSUInteger count  = 0;
       
 for (count=0; count<10; ++count) {
           
 NSLog(@"count= %d",count);
        }

    }];
   [self.blockOpertaion start];
   
}


运行结果:

    2013-10-24 16:28:46.267 OperationDemo[5459:c07] Parameter Object = 123
   
 2013-10-24 16:28:46.269 OperationDemo[5459:c07] Main Thread = <NSThread: 0x717ae10>{name = (null), num = 1}
    2013-10-24 16:28:46.269 OperationDemo[5459:c07] Current Thread = <NSThread: 0x717ae10>{name = (null), num = 1}  
    2013-10-24 16:38:07.240 OperationDemo[5478:c07] Main Thread = <NSThread: 0x7184650>{name = (null), num = 1}
    2013-10-24 16:38:07.240 OperationDemo[5478:c07] Current Thread = <NSThread: 0x7184650>{name = (null), num = 1}
    
 2013-10-24 16:38:07.240 OperationDemo[5478:c07] count= 0
    
 2013-10-24 16:38:07.241 OperationDemo[5478:c07] count= 1
    
 2013-10-24 16:38:07.241 OperationDemo[5478:c07] count= 2
    
 2013-10-24 16:38:07.241 OperationDemo[5478:c07] count= 3
    
 2013-10-24 16:38:07.241 OperationDemo[5478:c07] count= 4
    
 2013-10-24 16:38:07.242 OperationDemo[5478:c07] count= 5
    
 2013-10-24 16:38:07.242 OperationDemo[5478:c07] count= 6
    
 2013-10-24 16:38:07.242 OperationDemo[5478:c07] count= 7
    
 2013-10-24 16:38:07.243 OperationDemo[5478:c07] count= 8
    
 2013-10-24 16:38:07.243 OperationDemo[5478:c07] count= 9


注意:
          1.通过输出看以看出,这两个Operation都在主线程中执行的,NSInvocationOperation和NSBlockOperation的执行默认会在调用他们的函数所在的线程中去执行,例如我们在-(void) viewDidAppear:(BOOL)animated 函数中创建并启动一个operation的话,在没有使用NSOperationQueue的情况下,它会在-(void) viewDidAppear:(BOOL)animated所在的线程内即主线程中去执行。
     
三 使用 NSOperationQueue

   NSOperationQueue是用来管理Operation的,可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。
看下面这段代码:

@interface WBViewController ()
@property (nonatomic, strong) NSOperationQueue *operationQueue;
@property (nonatomic, strong) NSInvocationOperation *firstOperation;
@property (nonatomic, strong) NSInvocationOperation *secondOperation;
@end

@implementation WBViewController
@synthesize operationQueue   = _operationQueue;
@synthesize firstOperation       =_firstOperation;
@synthesize secondOperation =_secondOperation;

- (void) firstOperationEntry:(id)paramObject{
   
 NSLog(@"%s", __FUNCTION__);
   
 NSLog(@"Parameter Object = %@", paramObject);
   
 NSLog(@"Main Thread = %@", [NSThread mainThread]);
   
 NSLog(@"Current Thread = %@", [NSThread currentThread]);
}
- (
void) secondOperationEntry:(id)paramObject{
   
 NSLog(@"%s", __FUNCTION__);
   
 NSLog(@"Parameter Object = %@", paramObject);
   
 NSLog(@"Main Thread = %@", [NSThread mainThread]);
   
 NSLog(@"Current Thread = %@", [NSThread currentThread]);
}
调用代码:

    self.firstOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(firstOperationEntry:) object:[NSNumber numberWithInteger:111]];
   
 self.secondOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(secondOperationEntry:) object:[NSNumber numberWithInteger:222] ];
   
   [self.firstOperation addDependency:self.secondOperation];

输出结果:
 2013-10-25 16:41:57.101 OperationDemo[8424:1903] -[WBViewController firstOperationEntry:]
 
2013-10-25 16:41:57.103 OperationDemo[8424:1903] Parameter Object = 111
 
2013-10-25 16:41:57.103 OperationDemo[8424:1903] Main Thread = <NSThread: 0x71216f0>{name = (null), num = 1}
 
2013-10-25 16:41:57.105 OperationDemo[8424:1903] Current Thread = <NSThread: 0x7579120>{name = (null), num = 3}
 
2013-10-25 16:41:57.102 OperationDemo[8424:4607] -[WBViewController secondOperationEntry:]
 
2013-10-25 16:41:57.106 OperationDemo[8424:4607] Parameter Object = 222
 
2013-10-25 16:41:57.106 OperationDemo[8424:4607] Main Thread = <NSThread: 0x71216f0>{name = (null), num = 1}
 
2013-10-25 16:41:57.107 OperationDemo[8424:4607] Current Thread = <NSThread: 0x7578fd0>{name = (null), num = 4}


注意:1.通过观测我们发现两个操作分别线程号为num3和num=4的线程中运行,从而实现了并行执行
           2..当我们将操作(NSOperation)添加到操作队列NSOperationQueue之后,操作队列可能立即会执行我们的操作也可能会在以后某个时刻去执行,具体什么时候执行我们是无法控制的。
           3.当有多个操作的时候,他们启动执行顺序也是不确定的,但是我们可以绑定操作之间的依赖关系。

    self.firstOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(firstOperationEntry:) object:[NSNumber numberWithInteger:111]];
   
 self.secondOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(secondOperationEntry:) object:[NSNumber numberWithInteger:222
] ];
   
 
   //  [self.firstOperation removeDependency:self.secondOperation] //解除依赖关系
    [self.firstOperation addDependency:self.secondOperation];
使用addDependency建立依赖关系,这样的话firstOperation会在secondeOperation执行完后再执行,然后我们使用removeDependency可以解除依赖关系。
           
         4.除此之外,我们也可以之间将一个代码块添加到操作队列中去。例如:

       [self.operationQueue addOperationWithBlock:^{
           
 NSLog(@"Curent Thread ID:=%@",[NSThread currentThread]);
           
 NSLog(@"######:Hello World");
       }];

四 将自定义的操作添加到操作队列中

我们需要做一下事情:
            a.重写 isConcurrent方法  并返回 YES
            b.
重写 isStart方法           操作队列会调用该方法来执行操作
            c.
重写 isCancelled方法    操作队列会周期性调用该方法查看当前操作的执行情况
            d.
重写 main方法,并创建自己的自动回收池,在main函数返回前来释放资源回收池
            e.
重写 isFinished和isExecuting方法来反馈跟踪操作执行情况



直接上代码:
.h文件:
#import <Foundation/Foundation.h>

@interface CountingOperation : NSOperation

@property(nonatomic,assign) BOOL isFinished;
@property(nonatomic,assign) BOOL isExecuting;

-(
id) initWithStartingCount:(NSInteger) startCount
                endingCount:(
NSInteger) end;
@end


.m文件
#import "CountingOperation.h"

@interface CountingOperation()

@property(nonatomic,assign) NSInteger startCount;
@property(nonatomic,assign) NSInteger end;

@end

@implementation CountingOperation
@synthesize startCount  = _startCount;
@synthesize end         = _end;
@synthesize isFinished  = _isFinished;
@synthesize isExecuting = _isExecuting;

-(
id) init
{
   
 return  [self initWithStartingCount:0 endingCount:100];
}

-(
id) initWithStartingCount:(NSInteger) startCount
                  endingCount:(
NSInteger) end
{
   
 if (self = [super init])
    {
       
 self.startCount = startCount;
       
 self.end = end;
    }
   
   
 return self;
}
//Conflicting return type in implementation of 'start': 'NSInteger' (aka 'int') vs 'void'

- (
void) start
{
   
 if ([self isFinished])
    {
       
        [
self willChangeValueForKey:@"isFinished"];
        
 self.isFinished = YES;
        [
self didChangeValueForKey:@"isFinished"];
       
 return;
    }
   
 else
    {
       
 /* If this operation is *not* cancelled */
       
 /* KVO compliance */
        [
self willChangeValueForKey:@"isExecuting"];
       
 self.isExecuting = YES;
       
 /* Call the main method from inside the start method */
        [
self didChangeValueForKey:@"isExecuting"];
        [
self main];
    }
}
- (
void) main
{
   
 @try {
       
 /* Here is the autorelease pool */
       
 @autoreleasepool
        {
            
 NSLog(@"######:Current Thread = %@", [NSThread currentThread]);
           
 /* Keep a local variable here that must get set to YES whenever we are done with the task */
           
 BOOL taskIsFinished = NO;
           
 /* Create a while loop here that only exists
             if the taskIsFinished variable is set to YES or the operation has been cancelled */

           
 while (taskIsFinished == NO && [self isCancelled] == NO)
            {
               
 /* Perform the task here */
               
 NSLog(@"Main Thread = %@", [NSThread mainThread]);
               
 NSLog(@"Current Thread = %@", [NSThread currentThread]);
               
 NSUInteger counter = self.startCount;
               
               
 for (counter = self.startCount;counter < self.end;counter++)
                {
                   
 NSLog(@"Count = %lu", (unsigned long)counter);
                }
               
 /* Very important. This way we can get out of the
                  loop and we are still complying with the cancellation rules of operations */

                taskIsFinished =
 YES;
            }
           
 /* KVO compliance. Generate the required KVO notifications */
            [
self willChangeValueForKey:@"isFinished"];
            [
self willChangeValueForKey:@"isExecuting"];
           
           
 self.isFinished = YES;
           
 self.isExecuting = NO;
           
            [
self didChangeValueForKey:@"isFinished"];
            [
self didChangeValueForKey:@"isExecuting"];
        }
    }
   
 @catch (NSException * e)
    {
       
 NSLog(@"Exception %@", e);
    }
}
- (
BOOL) isFinished{
   
 /* Simply return the value */
   
 return(_isFinished);
}
- (
BOOL) isExecuting{
   
 /* Simply return the value */
   
 return(_isExecuting);
}
- (
BOOL) isConcurrent{
   
 return YES;
}
@end

调用方法:
 self.customOperation = [[CountingOperation alloc] initWithStartingCount:0 endingCount:10];
 [self.operationQueue addOperation:self.customOperation];

输出结果:
  2013-10-25 17:06:05.607 OperationDemo[8562:4803] Main Thread = <NSThread: 0x7147910>{name = (null), num = 1}
    
 2013-10-25 17:06:05.607 OperationDemo[8562:4803] Current Thread = <NSThread: 0x717b350>{name = (null), num = 3}
    
 2013-10-25 17:06:05.608 OperationDemo[8562:4803] Count = 0
    
 2013-10-25 17:06:05.616 OperationDemo[8562:4803] Count = 1
    
 2013-10-25 17:06:05.616 OperationDemo[8562:4803] Count = 2
    
 2013-10-25 17:06:05.617 OperationDemo[8562:4803] Count = 3
    
 2013-10-25 17:06:05.617 OperationDemo[8562:4803] Count = 4
    
 2013-10-25 17:06:05.617 OperationDemo[8562:4803] Count = 5
    
 2013-10-25 17:06:05.617 OperationDemo[8562:4803] Count = 6
    
 2013-10-25 17:06:05.618 OperationDemo[8562:4803] Count = 7
    
 2013-10-25 17:06:05.618 OperationDemo[8562:4803] Count = 8
    
 2013-10-25 17:06:05.619 OperationDemo[8562:4803] Count = 9

注意:
   1.在以上的代码中我们使用了KVO机制来,可以让你来观察任务的状态。
   2.除此之外,我们也可以挂起和取消所有操作
    3.通过使用setMaxConcurrentOperationCount来设置线程池中的线程数,也就是并发操作数。默认情况下是-1,也就是没有限制,同时运行队列中的全部操作。
   4.两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的

四 总结

        NSOperation和NSOperationQueue是在IOS中实现并发执行的方式之一,除此之外我们还可以使用苹果最新推出的GCD技术来更加容易实现并发。关于这两种多线程模型的异同,会在以后的博文中做深入分析。

Camera2Demo 在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作 立即下载

相关推荐

对比学习损失函数避坑指南:为什么你的自监督模型不收敛?

本文深入剖析对比学习损失函数中的关键陷阱,揭示自监督模型不收敛的根本原因。通过分析温度系数选择、负样本采样策略和特征归一化等核心因素,提供实用解决方案。实验数据表明,正确设置温度系数τ(建议0.07起)可提升30%性能,而MoCo风格的负样本队列比SimCLR方案在小批量时准确率高6-8%。

nokia的博客 922

(五十六)iOS多线程之NSOperation

NSOpertation是一套OC的API,是对GCD进行的Cocoa抽象。 NSOperation有两种不同类型的队列,主队列和自定义队列。 主队列运行于主线程上,自定义队列在后台运行。

最美的时光 730

NDVI空间分布变化Slope趋势分析与F检验(自用)

1.NDVI数据预处理2.一元线性回归分析3.Slope趋势分析与F检验

什么都学亿点点的博客 9017

NSOperation的串行、并行及自定义NSOperation的使用

1. NSBlockOperation 使用start 使用start直接调用是同步的,在当前线程执行 #import <Foundation/Foundation.h> int main(){ //Demo1: start NSLog(@"当前线程是%@",[NSThread currentThread]); NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:

powerof10的博客 788

分位数映射数据后处理-Quantile Mapping后处理 (R语言)

统计后处理器基本上是统计模型,将观察到的关注变量与从气象或水文模型的直接模型输出(DMO)导出的适当预测变量相关联。统计后处理的重要性早已在气象预报中得到认可。早期的工作包括完善的预测(perfect prognosis),模型输出统计(MOS)和模拟方法(analog method)等模型。 近年来,已经提出了许多其他后处理方法,包括秩直方图校准(rank histogram calibrati...

水滴石穿,绳锯木断 1万+

病理图像处理个人手札(三)WSI & MIL

1.什么是WSI? WSI全称是Whole Slide Image,也就是全视野数字切片,主要应用在病理学细胞图像领域。WSI 是利用数字扫描仪对传统的病理切片进行扫描,采集具有高分辨率的数字图像,再通过计算机将得到的碎片化图像进行无缝拼接整合,制作可视化数字图像的一项技术。与传统载玻片相比,很好地解决了传统的玻璃切片易损坏、易褪色、易丢片、检索困难的问题。 一言以蔽之,WSI是对传统载玻片进行数字化。 由于是全视野,因此它将包含多尺度的切片在一个文件上面。因此WSI将使用到金字塔模型满足其支持不同分辨率的

baiweizeng的博客 1万+

【iOS】—— NSOperation、NSOperationQueue

是苹果提供给我们的一套多线程解决方案。实际上是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。如果使用子类 NSInvocationOperation、NSBlockOperation 不能满足日常需求,我们可以使用自定义继承自 NSOperation 的子类。可以通过重写 main 或者 start 方法 来定义自己的 NSOperation 对象。重写main方法比较简单,我们不需要管理操作的状态属性 isExecuting 和 isFinished。

m0_62386635的博客 852

Hermes接入IMA知识库全攻略:将知识库装进你的Hermes智能体

本文详细介绍了如何将IMA知识库功能接入Hermes Agent平台,实现一站式笔记管理和知识库操作。主要内容包括:获取IMA访问凭证、下载技能包、配置凭据(支持文件和环境变量两种方式)、验证配置有效性,以及实际应用演示(查询知识库列表、创建笔记并添加到知识库)。文章还提供了常见问题解决方案,如认证失败处理、版本更新等。通过该集成,用户可在Hermes中直接调用IMA的笔记创建、知识库管理等强大功能,提升工作效率。

小石头的专栏 641

iOS-nsoperration的简单操作

// // ViewController.m // 01-nsoperration // // Created by panba on 16-10-16. // Copyright (c) 2016年 panba. All rights reserved. // #import "ViewController.h" @interface ViewController ()

小树苗不知道 670

sas协议(SAS PL-3)之Zoning功能

1 Zoning overview SAS zoning is implemented by a set of zoning expander devices with zoning enabled that define a zoned portion of a service delivery subsystem (ZPSDS)服务子系统. The zoning expander devices control whether a phy is permitted to participate in

sinat_37817094的博客 1530

UG\NX二次开发 分割曲线

分割曲线没有ufun函数?那就换一种思路实现。

王牌飞行员_里海的博客 1145

如何使用NSOperations和NSOperationQueues(二)

NSOperation API NSOperation 类有一个相当简短的声明。要定制一个操作,可以遵循以下步骤: 1.继承NSOperation类 2.重写“main”方法 3.在“main”方法中创建一个“autoreleasepool” 4.将你的代码放在“autoreleasepool”中 创建你自己的自动释放池的原因是,你不能访问主线程的自动释放池

pilqc2009的专栏 537

大唐杯历届省赛押题训练(6)

考试-TD-LTE无线网络设备介绍-TD-LTE网络架构一、单选题1TD-LTE的接入网E-UTRAN由下列哪些网元组成( )。0分/1分A、RNCB、BTSC、eNode BD、Node B提交答案:B正确答案:C考点TD-LTE网络架构解析暂无试题解析二、多选题1关于LTE网络整体结构,哪些说法是正确的( )0分/2分A、E-UTRAN用E-NodeB替代原有的RNC-NodeB结构B、E-NodeB间的接口为S1接口C、各网络节点之间的接口使用IP传输。

nimo观察者 636

IOS学习 NSOperation 并发数量、暂停/继续、取消、等待、依赖 与GCD区别

@interface ViewController () //定义一个全局的队列 @property (nonatomic,strong)NSOperationQueue *opQueue; @end @implementation ViewController //初始化对象 -(NSOperationQ

ridxmc的博客 6503

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NSOperationQueue与GCD的使用原则和场景

首先,我们要明确NSOperationQueue与GCD之间的关系 NSOpertaionQueue用GCD构建封装的,是GCD的高级抽象。 其次,我们要区别两者的不同 GCD仅仅支持FIFO队列,而NSOperationQueue中的队列可以被重新设置优先级,从而实现不同操作的执行顺序调整。 GCD不支持异步操作之间的依赖关系设置。如果某个操作的依赖另一个操作的数据(生产者-消费者模型是其中之一),使用NSOperationQueue能够按照正确的顺序执行操作。GCD则没有内建的依赖关系支持。 NS

尘雨::执着VC 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

iOS-多线程--介绍NSOperration

一个NSOperation对象就代表一个操作,对象相当于GCD中的block。 一、NSOperation的作用: 配合使用NSOperation和NSOperationQueue也能实现多线程。 二、NSOperation和NSOperationQueue实现多线程的步骤: 步骤1: 先将需要执行的操作封装到一个NSOperation对象中; 步骤2: 系统会自动...

abc19630915的博客 191

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

iOS多线程编程之Operation Queues

相对于GCD来说,Operation Queues会更加复杂一些,但是可以为operation之间添加依赖关系、暂停和恢复Operation Queue、取消正在执行的operation。这是GCD所做不到的。Operation要使用Operation Queue技术,需要使用NSOperation类来封装需要执行的任务。但是,NSOperation本身不能实例化,所以必须使用系统本身就实现好的两个

科C的专栏 696

iOS 多线程 NSOperation的简单使用——iOS 编码复习(八)(多线程6)

使用NSOpretion和NSOperationQueue进行多线程开发就是将NSOperation放到NSOperationQueue这个队列中,线程就会依次启动。NSOperationQueue就是一个队列。而NSOperation是相当于一个抽象类,不能直接使用,所以我们一般都使用它的两个子类来实现:NSInvocationOperation和NSBlockOperation,它们本质没有很

u012297622的博客 628

多线程(三) NSOperation,NSOperationqueue

/*------------------------------  NSOperation使用 1.简介  -----------------------------------*/ 重点:理解操作 NSOperation 和操作队列 NSOperationQueue! 操作队列 NSOperationQueue :1> 决定操作在哪条线程执行 2>管理操作(暂停/恢复 取消) 3>

M_SR_的博客 512

iOS 并发:NSOperation 与调度队列入门(1)

一直以来,并发都被视为 iOS 开发中的「洪水猛兽」。许多开发者都将其视为危险地带,唯恐避之而不及。更有谣传认为,多线程代码应该尽力避免。笔者同意,如果你对并发的了解不够深入,就容易造成危险。但是,危险往往是因为无知。想想吧,在人们的日常生活中,会经历多少危险的行为或活动?但是,一旦掌握其要领,也就是一碟小菜罢了。 并发就是一柄值得你学习...

weixin_34321977的博客 262

iOS总结-多线程篇之NSOperation和NSOperationQueue

参考:https://www.jianshu.com/p/4b1d77054b35 NSOperation/NSOperationQueue是基于GCD更高一层的封装,完全面向对象。 优点:1.可添加完成的代码块,在操作完成后执行             2.添加操作之间的依赖关系,方便控制执行顺序             3.设定操作的优先级             4.可以很方便的取...

qq_28551705的博客 1562

iOS三种多线程编程的技术介绍

1、简介: 1.1 iOS有三种多线程编程的技术,分别是: 1.、NSThread  2、Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用) 3、GCD  全称:Grand Central Dispatch( iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用) 这三种编程方式从上到下,抽

onebutterfly 397

IOS - 运行时 (多态)

IOS运行时介绍,包括类对象、id类型等。

zzbjut 7772

IOS 回调函数实现方法

//**********************************************************/// UtilNetWork.h// GASSEFB//// Created by zhangzhe on 13-9-26.// Copyright (c) 2013年 Haifeng. All rights reserved.//***********************

zzbjut 6562

IOS -AFNetworking 简介及使用

IOS AFNetworking开源框架的介绍和使用。

zzbjut 6517

IOS-本地存储-NSUserDefaults

UserDefaults的使用。

zzbjut 6316
上一篇: IOS KVO 机制
下一篇: MongoDB Shell 常用操作命令
张哲BJUT
博客等级 码龄15年 151粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值