你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS開發(64)之GCD任務最多只執行一次

IOS開發(64)之GCD任務最多只執行一次

編輯:IOS開發綜合

1 前言

使用 dispatch_once 函數 在 APP 的生命周期內來保證你想確保每段代碼只執行一次,即使它在代碼的不同地方多次調用(比如單例的初始化)。

 

2 代碼實例
ZYAppDelegate.m

 

[plain]
/一個用於調度一次函數的標識 
static dispatch_once_t onceToken; 
//Block Object 
void (^executedOnlyOnce)(void) = ^{ 
    static NSUInteger numberOfEntries = 0; 
    numberOfEntries++; 
    NSLog(@"Executed %lu time(s)", (unsigned long)numberOfEntries); 
}; 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    //聲明一個隊列 
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    //執行一次的隊列 
    dispatch_once(&onceToken, ^{ dispatch_async(concurrentQueue, 
                                                executedOnlyOnce); 
    }); 
    dispatch_once(&onceToken, ^{ dispatch_async(concurrentQueue, 
                                                executedOnlyOnce); 
    }); 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
    self.viewController = [[[ZYViewController alloc] initWithNibName:@"ZYViewController" bundle:nil] autorelease]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 

//一個用於調度一次函數的標識
static dispatch_once_t onceToken;
//Block Object
void (^executedOnlyOnce)(void) = ^{
    static NSUInteger numberOfEntries = 0;
    numberOfEntries++;
    NSLog(@"Executed %lu time(s)", (unsigned long)numberOfEntries);
};
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //聲明一個隊列
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //執行一次的隊列
    dispatch_once(&onceToken, ^{ dispatch_async(concurrentQueue,
                                                executedOnlyOnce);
    });
    dispatch_once(&onceToken, ^{ dispatch_async(concurrentQueue,
                                                executedOnlyOnce);
    });
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ZYViewController alloc] initWithNibName:@"ZYViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
ZYViewController.m

 

[plain]
- (void)viewDidLoad 

    [super viewDidLoad]; 
    ZYMySingleton *test = [[ZYMySingleton alloc] init]; 
    //循環單例方法 
    for (int i=0; i<5; i++) { 
        [test sharedInstance]; 
    } 
    [test release]; 

- (void)viewDidLoad
{
    [super viewDidLoad];
    ZYMySingleton *test = [[ZYMySingleton alloc] init];
    //循環單例方法
    for (int i=0; i<5; i++) {
        [test sharedInstance];
    }
    [test release];
}
ZYMySingleton.m

 

[plain] view plaincopyprint?- (id) sharedInstance{ 
    static ZYMySingleton *SharedInstance = nil; 
    //一個用於調度一次函數的標識 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
        SharedInstance = [ZYMySingleton new]; 
        NSLog(@"SharedInstance is ======>%@",SharedInstance); 
    }); 
    return SharedInstance; 

- (id) sharedInstance{
    static ZYMySingleton *SharedInstance = nil;
    //一個用於調度一次函數的標識
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        SharedInstance = [ZYMySingleton new];
        NSLog(@"SharedInstance is ======>%@",SharedInstance);
    });
    return SharedInstance;
}
運行後控制台顯示結果


2013-05-10 17:30:49.334 GCDSingleTest[2717:1303] Executed 1 time(s)

2013-05-10 17:30:49.336 GCDSingleTest[2717:c07] SharedInstance is ======><ZYMySingleton: 0x7195990>

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved