• iOS Block传值


      上个月,针对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和是否成功的标志了。。

  • 相关阅读:
    通过前序遍历和中序遍历确定二叉树,并输出后序遍历序列
    浅谈c语言和c++中struct的区别
    KFCM算法的matlab程序
    聚类——KFCM
    FCM算法的matlab程序2
    GMM算法的matlab程序
    FCM算法的matlab程序
    K-means算法的matlab程序
    GMM算法的matlab程序(初步)
    FCM算法的matlab程序(初步)
  • 原文地址:https://www.cnblogs.com/tanglimei/p/4791846.html
Copyright © 2020-2023  润新知