2013-02-13 49 views
-4

我試圖讓視頻開始播放時avplayer的屏幕截圖,所以我需要在後臺快速運行此代碼,所以它不會阻止主線程和其他控件同時運行,試圖運行代碼GCD格式我不能夠運行,請幫我做,它停在那裏我加入到我的數組(數組我加入UIImage對象)...GCD流如何編寫

if (isCaptureScreenStart) 
{ 
    if (CMTimeGetSeconds([avPlayer currentTime])>0) 
    { 
     if (avFramesArray!=nil) 
     { 
      queue = dispatch_queue_create("array", NULL); 
      dispatch_sync(queue, ^{ 
       [avFramesArray addObject:[self screenshotFromPlayer:avPlayer maximumSize:avPlayerLayer.frame.size :CMTimeGetSeconds([avPlayer currentTime])]];//stop at this line 
       NSLog(@"count:%d",[avFramesArray count]); 
       dispatch_sync(dispatch_get_main_queue(), ^{ 
        NSLog(@"Frame are created:%d",[avFramesArray count]); 
        if ([avFramesArray count]==0)  
        { 
         NSLog(@"Frame are over"); 
        } 
       }); 
      }); 
     } 
    } 
} 
dispatch_release(queue); 

編輯:

我想我現在需要使用dispatch_group_async這個塊..請給出一些指導h嗷嗷使用方法:

if (isCaptureScreenStart) 
{ 
    if (CMTimeGetSeconds([avPlayer currentTime])>0) 
    { 
     if (avFramesArray!=nil) { 
      dispatch_group_async(serial_group1, serial_dispatch_queue1, ^{ 
       [avFramesArray addObject:[self screenshotFromPlayer:avPlayer maximumSize:avPlayerLayer.frame.size :CMTimeGetSeconds([avPlayer currentTime])]]; 
      }); 
     } 
    } 
    dispatch_group_notify(serial_group1, serial_dispatch_queue1, ^{ 
     NSLog(@"task competed"); 
    }); 
} 

我現在用的這個塊,但上面的執行是有爭議的運行,如果我使用dispatch_suspend(serial_dispatch_queue1);其停止而我又需要開始塊的執行又是什麼,我需要用我也用dispatch_resume(serial_dispatch_queue1);嘗試再次加載但系統告訴我崩潰

+0

dispatch_group我需要如何創建??以及如何使用告訴步驟或任何示例 – Pallavi 2013-02-13 14:34:09

回答

1

dispatch_release(queue);不這樣做在那裏,你在調用它去一個backThread調度隊列,所以笏正在發生的事情是: -

您的隊列得到釋放在代碼塊執行之前。

因爲你的queue看起來像一個伊娃,發佈dealloc。休息一下,你的代碼看起來很好..在內部輸入一個斷點並檢查該塊是否正在執行。

編輯

我不明白,什麼你企圖通過掛起隊列來實現,沒有必要去做。你不需要檢查塊是否已經完成執行。該塊將完成,然後調用dispatch_async,獲取主隊列並從那裏更新UI。

現在,當您創建隊列時,請在您的方法中懶洋洋地創建它。走隊列爲伊娃在頭文件:

@interface YourFileController : UIViewController { 
    dispatch_queue_t queue; 
} 

然後在你的方法修改爲這樣:

if (isCaptureScreenStart) 
{ 
    if (CMTimeGetSeconds([avPlayer currentTime])>0) 
    { 
     if (avFramesArray!=nil) 
     { 
      if (!queue) 
       queue = dispatch_queue_create("array", DISPATCH_QUEUE_SERIAL); 

      dispatch_sync(queue, ^{ 
       [avFramesArray addObject:[self screenshotFromPlayer:avPlayer maximumSize:avPlayerLayer.frame.size :CMTimeGetSeconds([avPlayer currentTime])]];//stop at this line 
       NSLog(@"count:%d",[avFramesArray count]); 
       dispatch_sync(dispatch_get_main_queue(), ^{ 
        NSLog(@"Frame are created:%d",[avFramesArray count]); 
        if ([avFramesArray count]==0)  
        { 
         NSLog(@"Frame are over"); 
        } 
       }); 
      }); 
     } 
    } 
} 

注意DISPATCH_QUEUE_SERIAL創建一個串行隊列,這意味着所有提交的區塊將以先進先出順序連續執行。一旦所有提交的塊得到執行,停留在隊列;)..submit另一塊給它,它執行塊:d

這代表一個整塊: -

[avFramesArray addObject:[self screenshotFromPlayer:avPlayer maximumSize:avPlayerLayer.frame.size :CMTimeGetSeconds([avPlayer currentTime])]];//stop at this line 
       NSLog(@"count:%d",[avFramesArray count]); 
       dispatch_sync(dispatch_get_main_queue(), ^{ 
        NSLog(@"Frame are created:%d",[avFramesArray count]); 
        if ([avFramesArray count]==0)  
        { 
         NSLog(@"Frame are over"); 
        } 
       }); 
+0

謝謝我已經刪除了dispatch_release(queue);也我的塊得到執行..但我的代碼得到停止在這一行** dispatch_sync(dispatch_get_main_queue(),^ {**和它不處理任何事情,你也可以告訴,如何檢查該塊是否完成和我在哪裏我錯了 – Pallavi 2013-02-13 12:43:56

+1

而不是'dispatch_async(dispatch_get_main_queue(),^ {'您正在同步調用主隊列上的塊,這是阻塞主線程_async'將異步獲取主隊列:)你會完成 – croyneaus4u 2013-02-13 12:52:46

+0

是的正確的100分給你.. :) NSLog(@「Thanks」);而且我在NSTimer中調用該方法但現在我要如何檢查**我的塊是否已完成** – Pallavi 2013-02-13 13:05:52