1. 程式人生 > >iOS開發—執行緒的模擬暫停和繼續操作

iOS開發—執行緒的模擬暫停和繼續操作

表檢視開啟執行緒下載遠端的網路介面,滾動頁面時勢必會有影響,降低使用者的體驗。針對這種情況,當用戶滾動螢幕的時候,暫停佇列;使用者停止滾動的時候,繼續恢復佇列。接下來通過一個案例,演示如何暫停和繼續操作,具體內容如下:

(1)新建一個SingleViewApplication工程,命名為“13-SuspendAndContinue”;

(2)進入Main.StoryBoard,從物件庫中拖拽3個Button到程式介面,分別設定Title為“新增”,“暫停”和“繼續”,並且用拖拽的方式給這3個控制元件進行單擊響應的宣告,分別對應這新增操作、暫停操作、繼續操作。介面如下:


(3)進入ViewController.m檔案,在單擊“新增”按鈕後激發的方法中,首先設定操作的最大併發運算元為1,向建立的佇列中新增20個操作,然後為執行緒設定休眠時間為1.0s ,相當於GCD的非同步序列操作;

(4)當佇列中的操作正在排隊時,則將呼叫setSuspended: 方法傳入YES引數將其掛起;當佇列中的操作被掛起的時候,則呼叫setSuspended: 方法傳入NO引數讓它們繼續排隊,程式碼如下:

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong)NSOperationQueue *queue;
- (IBAction)addOperation:(id)sender;
- (IBAction)pause:(id)sender;
- (IBAction)resume:(id)sender;

@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.queue=[[NSOperationQueue alloc] init];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
//新增operation
- (IBAction)addOperation:(id)sender {
    //設定操作的最大併發運算元
    self.queue.maxConcurrentOperationCount=1;
    for(int i=0;i<20;i++)
    {
        [self.queue addOperationWithBlock:^{
        //模擬休眠
            [NSThread sleepForTimeInterval:1.0f];
            NSLog(@"正在下載%@%d",[NSThread currentThread],i);
        }];
    }
}
//暫停
- (IBAction)pause:(id)sender {
    //判斷佇列中是否有操作
    if(self.queue.operationCount==0){
        NSLog(@"沒有操作");
        return;
    }
    //如果沒有被掛起,才需要暫停
    if(!self.queue.isSuspended){
        NSLog(@"暫停");
        [self.queue setSuspended:YES];
    }else{
        NSLog(@"已經暫停");
    }
}
//繼續
- (IBAction)resume:(id)sender {
    //判斷佇列中是否有操作
    if(self.queue.operationCount==0){
        NSLog(@"沒有操作" );
        return;
    }
    //如果沒有被掛起,才需要暫停
    if(self.queue.isSuspended){
        NSLog(@"繼續");
        [self.queue setSuspended:NO];
    }else{
        NSLog(@"正在執行");
    }
    
}
@end
執行程式,程式的執行結果如下:


從圖中可以看出,當單擊“暫停”按鈕後,有一個執行緒還要繼續並執行完畢,這是因為當佇列執行暫停的時候,這個執行緒仍在執行,只有其餘排隊的執行緒被掛起。

相關推薦

iOS開發執行模擬暫停繼續操作

表檢視開啟執行緒下載遠端的網路介面,滾動頁面時勢必會有影響,降低使用者的體驗。針對這種情況,當用戶滾動螢幕的時候,暫停佇列;使用者停止滾動的時候,繼續恢復佇列。接下來通過一個案例,演示如何暫停和繼續操作,具體內容如下: (1)新建一個SingleViewApplicatio

IOS執行之NSoperationGCD的比較

GCD是基於c的底層api,NSOperation屬於object-c類。iOS首先引入的是NSOperation,IOS4之後引入了GCD和NSOperationQueue並且其內部是用gcd實現的。 相對於GCD: 1,NSOperation擁有更多的函式可用,具體檢視api。

【.NET】執行暫停掛起

C#中使得多執行緒暫停掛起的方法有多種,但各有不同。我逐個說明: sleep方法是個靜態方法,由thread類來呼叫。它只能暫停當前執行緒,不能暫停其他執行緒。它接受的引數指名這個執行緒需要休眠多少時間。 suspend方法是普通方法,由物件呼叫,他不但能夠終止

iOS開發執行之間資源共享(以賣火車票為例)—同步鎖的使用

      程序中的一塊資源可能會被多個執行緒共享,也就是多個執行緒可能會訪問同一塊資源,這裡的資源包括物件、變數、檔案等。當多個執行緒同時訪問同一塊資源時,會造成資源搶奪,很容易引發資料錯亂和資料安全問題。      為了更好的理解執行緒安全的問題,引入一個賣票的案例,同

iOS開發執行間的通訊

在一個程序中,執行緒往往不是孤立存在的,多個執行緒之間要經常進行通訊,成為執行緒間的通訊。 執行緒間的通訊主要體現在,一個執行緒執行完特定任務後,轉到另一個執行緒去執行任務,在轉換任務的同時,將資料也傳遞給另外一個執行緒。 NSThread類提供了兩個比較常用的方法,用於實

C# 執行暫停恢復的 實現

<?xml version="1.0" encoding="UTF-8"?> 我們可以通過ManualResetEvent類來實現。 宣告, 初始化時不執行private static

iOS--------如何在ios中運用core animation暫停繼續動畫

核心程式碼如下 //暫停layer上面的動畫 - (void)pauseLayer:(CALayer*)layer { CFTimeInterval pausedTime = [laye

Java多執行併發鎖原子操作,你真的瞭解嗎?

前言                 對於Java多執行緒,接觸最多的莫過於使用synchronized,這個簡單易懂,但是這synchronized並非效能最優的。今天我就簡單介紹一下幾種鎖。可能我下面講的時候其實很多東西不會特別深刻,最好的方式是自己做實驗,把各種場景在

iOS 開發執行及其程序執行的介紹理解

iOS開發多執行緒篇—多執行緒簡單介紹 一、程序和執行緒 1.什麼是程序 程序是指在系統中正在執行的一個應用程式 每個程序之間是獨立的,每個程序均執行在其專用且受保護的記憶體空間內 比如同時開啟QQ、Xcode,系統就會分別啟動2個程序 通過“活動監視器”可以檢視Mac系統中所開啟的程序 2.什

使用執行模擬企業的生產者消費者

測試類: public class Test01 { public static void main(String[] args) { MyStorage storage = new MyStorage(); Producer producer = new Producer(st

iOS開發-iOS執行開發中踩過的坑-GCD的特性-NSOperation執行依賴-iOS執行踩坑小結

本期內容: iOS開發中從其他執行緒回到主執行緒的方法 dispatch_group_create 組的概念 dispatch_sync同步排程主執行緒會死鎖的原因 專案中什麼時候選擇GCD什麼時候選擇NSOperation NSOperation 執行緒依賴

生產者消費者多執行模擬

package yn.ngems.cn; class Message{     private String title;     private String content;     private boo

iOS執行Call Stack的捕獲解析(二)

1. 部分參考資料 做這一塊時也是查閱了很多連結和書籍,包括但不限於: 以及很多Google Search。 2. 相關API和資料結構 由於我們在上面回溯執行緒呼叫棧拿到的是一組地址,所以這裡進行符號化的輸入輸出應該分別是地址和符號,介面設

ios-多執行技術在開發中的應用場景

我們可能學習了多執行緒之後,覺得幾乎都用不到多執行緒,因為如果用第三方框架,都已經給我們封裝好了。這裡舉兩個例子,用到多執行緒的概念的。 如果我們自定義了一個collectionView之後,在初始化方法中想要呼叫下面這個方法 self.collectionView.

IOS執行開發其實很簡單

概覽 大家都知道,在開發過程中應該儘可能減少使用者等待時間,讓程式儘可能快的完成運算。可是無論是哪種語言開發的程式最終往往轉換成組合語言進而解釋成機器碼來執行。但是機器碼是按順序執行的,一個複雜的多步操作只能一步步按順序逐個執行。改變這種狀況可以從兩個角度出發:對於單核

iOS執行中,佇列執行的排列組合結果分析

本文是對以往學習的多執行緒中知識點的一個整理。 多執行緒中的佇列有:序列佇列,併發佇列,全域性佇列,主佇列。 執行的方法有:同步執行和非同步執行。那麼兩兩一組合會有哪些注意事項呢? 如果不是在董鉑然部落格園看到這邊文章請 點選檢視原文 提到多執行緒,也就是四種,pthread,NSthread,GCD

iOS執行篇:NSThread簡單介紹使用

一、什麼是NSThread NSThread是基於執行緒使用,輕量級的多執行緒程式設計方法(相對GCD和NSOperation),一個NSThread物件代表一個執行緒, 需要手動管理執行緒的生命週期

iOS執行程式設計之Grand Central Dispatch(GCD)介紹使用

介紹: Grand Central Dispatch 簡稱(GCD)是蘋果公司開發的技術,以優化的應用程式支援多核心處理器和其他的對稱多處理系統的系統。這建立在任務並行執行的執行緒池模式的基礎上的。它首次釋出在Mac OS X 10.6 ,iOS 4及以上也可用。 設計:

暫停執行(suspendresume)

不多說程式碼演示:public class MyThread extends Thread { private long i = 0; public long getI() { return

iOS --- 如何暫停繼續CALayer上的動畫

本文主要介紹瞭如何暫停和繼續CALayer的動畫. 首先來看CALayer. /** The base layer class. **/ @interface CALayer : NSObject <NSCoding, CAMediaTiming&