2014年5月20日 星期二

iOS7 的main thread只是UI預設的執行緒,不是code的

為了要檢查get main queue的順序與值的對應關係,我寫了下列程式碼
__block int i = 1;
    NSLog(@"1. normal 1  i=%i",i);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"2. after two seconds  i=%i",i);
        i = 2;
    });
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"3. main thread 1  i=%i",i);
        i = 3;
    });
    NSLog(@"4. normal 2  i=%i",i);
    i = 4;
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"5. main thread 2  i=%i",i);
        i = 5;
    });

    NSLog(@"i =%i",i);

得到的結果如下,
2014-05-20 16:45:00.513 ConceptComfirm[25891:60b] viewDidLoad
2014-05-20 16:45:00.513 ConceptComfirm[25891:60b] class : Concepts
2014-05-20 16:45:00.514 ConceptComfirm[25891:60b] 1. normal 1  i=1
2014-05-20 16:45:00.514 ConceptComfirm[25891:60b] 4. normal 2  i=1
2014-05-20 16:45:00.514 ConceptComfirm[25891:60b] i =4
2014-05-20 16:45:00.515 ConceptComfirm[25891:60b] viewWillAppear
2014-05-20 16:45:00.652 ConceptComfirm[25891:60b] viewDidAppear
2014-05-20 16:45:00.652 ConceptComfirm[25891:60b] 3. main thread 1  i=4
2014-05-20 16:45:00.653 ConceptComfirm[25891:60b] 5. main thread 2  i=3
2014-05-20 16:45:02.516 ConceptComfirm[25891:60b] 2. after two seconds  i=5

結論是,iOS7已經不再將code預設執行的main thread
而是把UI用main thread去跑,你想要跑在main thread的code要自行宣告使用。

Note.
//創造一個新的執行緒
dispatch_queue_t _newQueue   = dispatch_queue_create("forCentralManagerOnly", DISPATCH_QUEUE_SERIAL);

沒有留言:

張貼留言