[Cocoa]_[初级]_[使用异步线程加载图片文件实现进度条的更新]

来源:互联网 发布:mysql锁表 解锁 编辑:程序博客网 时间:2024/05/22 17:42

其中:主线程主要用来进行界面的描绘和更新。异步线程主要是用来加载一些耗时的工作,比如加载数据等等。


1.头文件MainObject.h

#import <Cocoa/Cocoa.h>@class LoadData;@interface MainObject: NSObject{   IBOutlet NSprogressIndicator *progressBar; //在MainMenu.lib中创建一个NSprogressIndicator ,设置范围0--100.0   LoadData *loadData;}@property (readwrite,assign) LoadData *loadData;-(IBAction) onAddImage:(id) sender;  //在界面上创建一个控件设置代理,用于添加文件操作。-(void)updateProgressBar:(id)data;@end


2.源文件MainObject.m

#import "LoadData.h"#import "MainObject.h"@implementation LoadData@synthesize loadData;-(IBAction) onAddImage:(id) sender{    NSOpenPanel *panel = [NSOpenPanel openPanel];    [panel setAllowsMultipleSelection:YES];    [panel setAllowedFileTypes:[NSImage imageFileTypes]];        // Run the open panel    [panel setMessage:@"Add Image Files"];    [panel beginSheetModalForWindow:[NSApp mainWindow] completionHandler:^(NSInteger result) {                if (result == NSFileHandlingPanelOKButton)        {            NSArray *paths = [panel filenames];            dispatch_async(dispatch_get_global_queue(                                                     DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),\\添加异步线程^{                [loadData setHandler:self];                [loadData doLoadImageFilePath:[paths retain]];                          });        }           }];      }-(void)updateProgressBar:(id)data{NSnumber *num = data;[progressbar setDouble:[num doubleValue]];}


3.头文件 LoadData.h

#import <Cocoa/Cocoa.h>@interface LoadData: NSObject{    id delegate;}-(void)setHandler:(id)handler;-(void) doLoadImageFilePath:(NSArray *) filePaths;@end


4.源文件  LoadData.m

#import "LoadData.h"#import "MainObject.h"@implementation LoadData-(void) setHandler:(id)handler{    delegate = handler;}-(void) doLoadImageFilePath:(NSArray *) filePaths item:(int) theItem{    NSArray *arrayAppendFilePaths = filePaths;    int i = 1;    int arrayLoadImageCount = [arrayAppendFilePaths count];        NSLog(@"dispatch_async isMainThread %d",[[NSThread currentThread] isMainThread]);        for(NSString *filePth in arrayAppendFilePaths)    {        double temp = i*100.0/arrayLoadImageCount;        [delegate performSelectorOnMainThread:@selector(updateProgressBar:) withObject:[NSNumber numberWithDouble:temp] waitUntilDone:NO];          //可以自己设置@selector(....),如更新图片、数据等等。这里是更新一个double。         ++i;     }}@end




0 0
原创粉丝点击