你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> ios中對事件動作的三種處理方式

ios中對事件動作的三種處理方式

編輯:IOS開發綜合

IOS上的消息處理機制同Android相比是更大的豐富拓展,IOS既有像類似Android的監聽機制也由類似的廣播方式。但通常來講可以分為這樣三類:

1.Notification(通知)

2.Helper objects(輔助對象)

3.Target-action(目標-動作模型)

如果是建一個IOS項目做個demo,大量的代碼誰都會受不了,於是我使用的mac上的Command Line程序。

我們都知道在IOS系統內部有一個一直在運轉的RunLoop,就像是一個活著的死循環,說他是死循環是因為只要系統不關機它都在後台運轉著,說他是活的是因為他最終還是在做著一些有用的工作,處理一些我們看得見看不見的處理。

在測試者三中方式的時候我建了一個Logger類,通過這個類來展現出三種方式的區別:

Logger.h:

#import 

@interface Logger : NSObject{
    NSMutableData *incomingData;
}
- (void)sayhello:(NSTimer *)t;
-(void)zoneChange:(NSNotification *)note;
@end

Logger.m:

#import "Logger.h"

@implementation Logger
-(void)sayhello:(NSTimer *)t{
    NSLog(@"hello 你好!");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"received %lu bytes",[data length]);
    if (!incomingData) {
        incomingData = [[NSMutableData alloc] init];
    }
    [incomingData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"got it all");
    NSString *string = [[NSString alloc] initWithData:incomingData encoding:NSUTF8StringEncoding];
    incomingData = nil;
    NSLog(@"strnig has %lu charachers",[string length]);
    NSLog(@"the all string: %@",string);
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"connection fail %@",[error localizedDescription]);
    incomingData = nil;
}
-(void)zoneChange:(NSNotification *)note{
    NSLog(@"the system time zone has changed");
}
-(void)dealloc{
#pragma 釋放該對象的“通知”
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    
}
@end

Logger 中的各種方法都是在後面的運行中會訪問的我會在下面一一說明:


在main.m中對上面的Logger類進行一個初始:

    @autoreleasepool {
        Logger *logger = [[Logger alloc] init];
	//這裡就是寫三種處理機制的代碼了;        
        [[NSRunLoop currentRunLoop] run];

        
    }
後面的 [[NSRunLoop currentRunLoop] run];就相當於開啟那個無限循環。

比如我們想要通知系統當時區改變時候要調用Logger中的zoneChange方法。我們可以這樣:(這就是一個簡單地Notification機制)

[[NSNotificationCenter defaultCenter] addObserver:logger selector:@selector(zoneChange:) name:NSSystemClockDidChangeNotification object:nil];

而Helper objects是這樣子的:

 NSURL *url = [NSURL URLWithString:@"http://localhost"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        __unused NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:logger startImmediately:YES];

它的結果就是調用Logger.m 中的那些帶有connection的方法,這些相當於是一個協議,只不過apple還沒有把他們封裝成一個protocol。

而Target-action也是同樣可以用下面一行代碼來解決:

__unused NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:logger selector:@selector(sayhello:) userInfo:nil repeats:YES];

一般的,target就相當於對象的名稱,而action就是對象的方法,在運用的時候會發現每1秒就會調用一個sayhell();這句代碼就是告訴RunLoop這樣做,而RunLoop不會停,也就是輸出也不會停。



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