上个月,针对block恶补了一下,以为自己全部掌握了,其实不尽然。

  昨天项目中在下载的时候用到,自己竟然不知道该从何下手,惭愧~

  

  情景是这个样子的:我写了个下载类,阴老师在调用时,将参数(sid,URL)传递给我,我拿到URL之后,进行下载,下载完成后,将结果传递给他:如果成功,返回sid和success为YES;如果失败,返回sid和success为NO。

  在将sid和success返回时,用到了block,他在调用的时候,方法是这个样子的:

- (void)downloadScriptWithSid:(NSString*)sid downloadUrl:(NSString*)url backBlock:(void(^)(NSString *sid, BOOL success))block;

  在我写这个方法的时候,就蒙圈了。不过现在算是明白过来了,于是总结一下:

1.我得先在自己的类中,建立一个block,其实就是给返回回去的block重新起一个名字:

@property(nonatomic, strong) void(^downloadFinishBlock)(NSString *sid, BOOL success);

  重新起的名字,是downloadFinishBlock,将它定义为一个属性,这样,在下面就能调用了。

2.在.m中,实现外部调用的方法:

- (void)downloadScriptWithSid:(NSString*)sid downloadUrl:(NSString*)url backBlock:(void(^)(NSString *, BOOL ))block
{
self.downloadFinishBlock = block; NSURLSession * download = [NSURLSession sharedSession];
NSURLSessionDownloadTask * downloadTask = [download downloadTaskWithURL:[NSURL URLWithString:url] completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
//如果没有出错
if (!error) {
//将文件转移到固定的文件夹下面
//1.判断文件夹是否存在,如果存在,直接放入;如果不存在,则创建一个文件夹(名字是当前用户的guid)
//1.1获取guid
NSString * guid = DGET(@"guid"); //1.2 判断文件夹是否存在
NSString * destinationPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:guid];
BOOL isExistDestinationFolder = [[NSFileManager defaultManager]fileExistsAtPath:destinationPath];
if (!isExistDestinationFolder) {
BOOL createSuccessOrNot = [[NSFileManager defaultManager]createDirectoryAtPath:destinationPath withIntermediateDirectories:YES attributes:nil error:nil];
if (createSuccessOrNot) {
NSLog(@"创建成功");
}else{
NSLog(@"创建失败");
[Tools showToastInWindow:@"创建失败"];
return ;
}
} //2.进行转移,以sid为唯一标识符,作为转移后文件的名称
NSString * sourceDownloadPathName = location.path;
NSString * destinationDownloadPathName = [destinationPath stringByAppendingPathComponent:sid];
NSString * destinationDownloadPath = [destinationDownloadPathName stringByAppendingPathExtension:@"lua"];
//---判断,如果该目录下文件已经存在,则将旧的文件删掉,否则会转移不成功
if ([[NSFileManager defaultManager]fileExistsAtPath:destinationDownloadPath]) {
//删掉
NSError * removeError;
[[NSFileManager defaultManager]removeItemAtPath:destinationDownloadPath error:&removeError];
if (!removeError) {
NSLog(@"已存文件已经删除");
}else{
NSLog(@"删除已存文件失败,moveError = %@",removeError);
return;
}
} NSError * moveError;
[[NSFileManager defaultManager]moveItemAtPath:sourceDownloadPathName toPath:destinationDownloadPath error:&moveError];
if (!moveError) {
NSLog(@"转移成功"); }else{
[Tools showToastInWindow:@"转移失败"];
NSLog(@"error = %@",[moveError description]);
return;
} self.downloadFinishBlock(sid,YES); }else{
self.downloadFinishBlock(sid,NO);
} }];
[downloadTask resume];
}

  这个代码,里面下载的东西比较多,和block传值没有多大关系,鉴于以后回顾,就留在这里吧。

self.downloadFinishBlock  = block;

  这句话,将传进来的block语句块保存在本类的实力变量downloadFinishBlock,这样,无论在.m的哪个位置,都能够调用并且往外传值了。

3.使用:

[[DownloadTool alloc]downloadScriptWithSid:@"1" downloadUrl:@"http://pic12.nipic.com/20101227/4750538_110523035117_2.jpg" backBlock:^(NSString *sid, BOOL success) {
NSLog(@"sid = %@",sid);
NSLog(@"success = %d",success);
}];

  这样,下载完,就会打印出sid和是否成功的标志了。。

iOS Block传值的更多相关文章

  1. iOS Block界面反向传值

    在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...

  2. iOS 页面间传值 之 单例传值 , block 传值

    ios 页面间传值有许多,前边已经分享过属性传值和代理传值,今天主要说一下单例传值和 block 传值 单例传值:单例模式一种常用的开发的模式,单例因为在整个程序中无论在何时初始化对象,获取到的都是同 ...

  3. iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)

    iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)   使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...

  4. iOS开发——代理与block传值

    一.代理传值的方法 1.Hehe1ViewController.h中 #import <UIKit/UIKit.h> @protocol Hehe1ViewControllerDelega ...

  5. IOS笔记047-代理传值和block传值

    在两个不同的控制器之间传递数据,可以使用代理传值或者block传值. 例子是一个简单通讯录. 主界面如下: 添加联系人界面 查看/编辑联系人界面:默认是查看模式,点击编辑后进入编辑模式 编辑模式 数据 ...

  6. iOS页面传值-wang

    iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notific ...

  7. iOS界面传值的方式(7种)

    iOS传值的方式 属性传值 方法传值 代理传值(delegate) block传值 单例模式方式 通知notification方式 UserDefault或者文件方式 1.属性传值 情况:A页面跳转到 ...

  8. iOS页面传值方式

    普遍传值方式如下: 1.委托delegate方式: 2.通知notification方式: 3.block方式: 4.UserDefault或者文件方式: 5.单例模式方式: 6.通过设置属性,实现页 ...

  9. ios Block详细用法

    ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...

随机推荐

  1. 【BZOJ】1089: [SCOI2003]严格n元树(递推+高精度/fft)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1089 题意:求深度为d的n元树数目.(0<n<=32, 0<=d<=16) ...

  2. BST & Treap

    二叉查找树递归定义: 二叉查找树是空树或不是空树二叉查找树的左二叉查找树的值一定小于二叉查找树的值或左二叉查找树为空树二叉查找树的右二叉查找树的值一定大于二叉查找树的值或右二叉查找树为空树 不维护父亲 ...

  3. Java学习第一步: Win7配置JDK环境

    转摘"专注JavaWeb开发":http://www.javaweb1024.com/java/Javajichu/2015/03/02/353.html 下载JDK并安装到本机  ...

  4. Mysql 学习

    一.ubuntu下mysql的安装: 通过sudo apt-get install mysql-server 完成: 然后可以通过/etc/init.d/mysql 进行start/stop/rest ...

  5. Linux下java获取CPU、内存、磁盘IO、网络带宽使用率

    一.CPU 使用proc文件系统,"proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口.用户和应用程序可以通过proc得 ...

  6. jBPM4.3+ssh+会签 整合配置及完整实例

    大佬们的项目里有用到会签,所以趁双休日研究了下. 其实也是简单的会签情况,不过开始的时候研究了4.4,(因为先前研究的都是4.4),发现4.4跟4.3的处理方法完全不一样,搞的我比较郁闷……弄了一天, ...

  7. for循环计算游戏通关分数

    一个游戏1到20关是成绩是自身关卡数的成绩,21-30每关10分,31-40每关20分,41-49每关30分,50关100分.输入一个关数求成绩 代码如下: <!DOCTYPE html PUB ...

  8. SQL中的charindex()方法

    CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置.CHARINDEX函数调用方法如下: CHARINDEX ( expression1 , expression2 [ , start ...

  9. php常用的对字符串进行加密的算法

    1. 返回文件扩展名 function getformat($file) { $ext=strrchr($file,"."); $format=strtolower($ext);  ...

  10. [转]C#开发ActiveX控件,.NET开发OCX控件案例

    引自:百度   http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...