iOS开发学习笔记(OC语言)——block使用示例

//
//  ViewController.m
//  ladder
//
//  Created by xxx on 2022/3/9.
//

#import "ViewController.h"

@interface ViewController()

@property(nonatomic, strong, readwrite) NSTextField *infoLabel;
@property(nonatomic, strong, readwrite) NSButton *infoBtn;
@property(nonatomic, strong) dispatch_queue_t queue;

typedef void (^writeProgress)(int progress);

-(void)writeFile:(NSString *)fileName content:(NSString *)content progress:(writeProgress) progress;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _queue = dispatch_queue_create("rwqueue", DISPATCH_QUEUE_CONCURRENT);
    
    [self.view addSubview:({
        self.infoLabel = [[NSTextField alloc]initWithFrame:CGRectMake(10, 10, self.view.frame.size.width - 20, self.view.frame.size.height - 80)];
        self.infoLabel;
    })];
    
    [self.view addSubview:({
        self.infoBtn = [[NSButton alloc]initWithFrame:CGRectMake(10,self.infoLabel.frame.size.height + 20, self.view.frame.size.width - 20, 50)];
        self.infoBtn.bordered = NO;
        self.infoBtn.wantsLayer = YES;
        self.infoBtn.layer.backgroundColor = [NSColor blueColor].CGColor;
        self.infoBtn.layer.cornerRadius = 5;
        [self setButtonTitleFor:self.infoBtn toString:@"Click Me" withColor:[NSColor whiteColor]];
        [self.infoBtn setTarget:self];
        [self.infoBtn setAction:@selector(_btnClick)];
        self.infoBtn;
    })];
    
}

- (void)setButtonTitleFor:(NSButton*)button toString:(NSString*)title withColor:(NSColor*)color{
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    [style setAlignment:NSTextAlignmentCenter];
    NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:color, NSForegroundColorAttributeName, style, NSParagraphStyleAttributeName, nil];
    NSAttributedString *attrString = [[NSAttributedString alloc]initWithString:title attributes:attrsDictionary];
    [button setAttributedTitle:attrString];
}

-(void)_btnClick{
    __weak __typeof(&*self)weakSelf = self;
    dispatch_async(_queue, ^{
        [self writeFile:@"test.txt" content:@"Hello IOS!" progress:^(int progress) {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"block current threadid: %@", [NSThread currentThread]);
                weakSelf.infoLabel.stringValue = [NSString stringWithFormat:@"progress: %d%%", progress];
            });
        }];
    });
    
}

-(void)writeFile:(NSString *)fileName content:(NSString *)content progress:(writeProgress) progress{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachePath = [paths firstObject];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    //创建文件
    NSString *listDataPath = [cachePath stringByAppendingPathComponent:fileName];
    [fileManager createFileAtPath:listDataPath contents:nil attributes:nil];

    //查询文件
    BOOL fileExist = [fileManager fileExistsAtPath:listDataPath];

    if (fileExist) {
        //文件追加内容
        NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:listDataPath];
        [fileHandle seekToEndOfFile];
        
        NSMutableArray *listItems = [NSMutableArray array];
        for (int i = 0; i < [content length]; i++) {
            NSString *ch = [content substringWithRange:NSMakeRange(i, 1)];
            [listItems addObject:ch];
            [listItems addObject:@"\n"];
        }
        
        for (int i = 0; i < listItems.count; i++) {
            [fileHandle writeData:[listItems[i] dataUsingEncoding:NSUTF8StringEncoding]];
            sleep(2);
            if (progress) {
                NSLog(@"current threadid: %@", [NSThread currentThread]);
                progress((int)((i+1)*1.0/listItems.count * 100));
            }
        }
        
        [fileHandle synchronizeFile];
        [fileHandle closeFile];
    }
}

@end

posted @ 2022-03-15 16:53  观海云不远  阅读(71)  评论(0编辑  收藏  举报