1. 程式人生 > >使用performSelector設計最簡單的重發機制

使用performSelector設計最簡單的重發機制

重發機制

在對網路進行http請求或者物聯網產業中對閘道器進行不斷的傳送資料幀時,重發機制是一個必須存在的功能,來保證使用者操作的可靠性,app會不斷的重複傳送,直到資料成功傳送,並且接受到回覆幀。

performSelector

performSelector: withObject:是在iOS中的一種方法呼叫方式。他可以向一個物件傳遞任何訊息,而不需要在編譯的時候宣告這些方法。

而重發機制就需要用到performSelector延遲函式。

一、首先解釋下performSelector方法中每個引數的意義:

- (void)performSelector:(SEL)selector withObject:(id)object afterDelay:(NSTimeInterval)delay;

(1)selector:表示你要呼叫的方法

(2)object:如果你要呼叫的方法中需要傳遞引數,那麼object就表示你要傳遞的值;如果你要呼叫的方法不需要傳遞引數,那麼就是nil

(3)delay:表示你要延遲的時間

二、如何進行重發

因為performSelector方法只是延時函式,所以我們使用遞迴。使用遞迴是一件很危險的事情,所以一定要謹慎使用,有幾個注意事項:

1.放在子執行緒裡,推薦使用GCD

2.必須新增判斷機制,重發幾次後停止重發

3.收到回覆後立刻停止重發

三、具體程式碼實現

程式碼實現非常簡單,只要在需要重發的函式最後加上以下程式碼,就可以完成遞迴重發,需要注意的是performSelector

必須在主執行緒中執行,不然會失效。

dispatch_async(dispatch_get_main_queue(), ^{
        [self performSelector:@selector(inquireTimer) withObject:nil afterDelay:3.f];
    });

取消重發,只需要將performSelector函式取消即可,程式碼如下:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(didRuninCurrModel:) object:nil];
[NSObject cancelPreviousPerformRequestsWithTarget:self];//取消所有的performSelector:方法