iOS 4 가지 리 셋 방법 요약
리 턴
리 셋 은 실행 가능 한 코드 와 특정한 이 벤트 를 연결 하 는 것 입 니 다.특정한 사건 이 발생 하면 이 코드 를 실행 합 니 다.
Objective-C 에 서 는 리 셋 을 실현 할 수 있 는 네 가지 경로 가 있다.
목표.-동작 맞 아.
프로그램 이 대기 시간 을 정 하기 전에'시간 이 발생 할 때 지 정 된 대상 에 게 특정한 정 보 를 보 내 라'고 요구 했다.여기 서 메 시 지 를 받 는 대상 은 목표 이 고 메시지 선택 기 는 동작 입 니 다.
보조 대상
절차 가 시작 되 기 전 까지 는'시간 발생 시 해당 합 의 를 준수 하 는 보조 대상자 에 게 메 시 지 를 보 내달 라'고 요청 했다.의뢰 대상 과 데이터 원본 은 흔히 볼 수 있 는 보조 대상 이다.
통지 하 다.
애플 은 알림 센터 라 는 대상 을 제공 했다.프로그램 이 기다 리 기 전에 알림 센터 에 알 릴 수 있 습 니 다.어떤 대상 이 특정한 통 지 를 기다 리 고 있 습 니 다."그 중 어떤 알림 이 나타 날 때 지정 한 대상 에 게 특정한 메 시 지 를 보 냅 니 다."사건 이 발생 하면 관련 대상 은 통지 센터 에 통 지 를 한 다음 에 통지 센터 에서 통 지 를 기다 리 고 있 는 대상 에 게 전달한다.
차단 대상
Block 은 실행 가능 한 코드 입 니 다.프로그램 이 기다 리 기 전에 Block 대상 을 설명 하고 이벤트 가 발생 했 을 때 이 Block 대상 을 실행 합 니 다.
NSRunLoop
iOS 에는 NSRunLoop 클래스 가 있 는데 NSRunLoop 인 스 턴 스 가 계속 기다 리 고 있 으 며 특정 이벤트 가 발생 하면 해당 대상 에 게 메 시 지 를 보 냅 니 다.NSRunLoop 인 스 턴 스 는 특정 이벤트 가 발생 했 을 때 리 셋 을 촉발 합 니 다.
순환 하 다.
리 셋 을 실현 하기 전에 순환 을 만들어 야 합 니 다:
int main(int argc, const char * argv[]) {
@autoreleasepool {
[[NSRunLoop currentRunLoop]run];
}
return 0;
}
목표.-동작 맞 아.NSRunLoop 대상 과 NSTimer 대상 을 가 진 프로그램 을 만 듭 니 다.2 초 마다 NSTimer 대상 은 대상 에 게 지정 한 동작 메 시 지 를 보 내 고 BNRLogger 라 는 새로운 종 류 를 만 듭 니 다.NSTimer 대상 의 대상 입 니 다.
BNRLogger.h 에서 동작 방법 설명:
#import <Foundation/Foundation.h>
@interface BNRLogger : NSObject<NSURLSessionDataDelegate>
@property(nonatomic) NSDate *lastTime;
-(NSString *) lastTimeString;
-(void)updateLastTime: (NSTimer *) t;
@end
BNRLogger.m 에서 실현 방법:
#import "BNRLogger.h"
@implementation BNRLogger
-(NSString *)lastTimeString
{
static NSDateFormatter *dateFormatter=nil;
if(!dateFormatter)
{
dateFormatter =[[NSDateFormatter alloc]init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSLog(@"created dateFormatter");
}
return [dateFormatter stringFromDate:self.lastTime];
}
-(void)updateLastTime:(NSTimer *)t
{
NSDate *now=[NSDate date];
[self setLastTime:now];
NSLog(@"Just set time to %@",self.lastTimeString);
}
@end
main.m 에서 BNRLogger 인 스 턴 스 를 만 듭 니 다:
#import <Foundation/Foundation.h>
#import "BNRLogger.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
BNRLogger *logger=[[BNRLogger alloc]init];
__unused NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:2.0 target:logger selector:@selector(updateLastTime:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop]run];
}
return 0;
}
보조 대상나의 이전 블 로그 에 NSURLSession 방법의 사용 이 적 혀 있 습 니 다.그러면 보조 대상 의 리 셋 사용 은 BNRLogger 대상 을 NSURLSession 의 의뢰 대상 으로 만 들 고 특정한 사건 이 발생 할 때 이 대상 은 보조 대상 에 게 메 시 지 를 보 냅 니 다.
main.m 에서 NSURL 대상 과 NSURLRequest 대상 을 만 듭 니 다.그리고 NSURLSession 대상 을 만 들 고 BNRLogger 의 인 스 턴 스 를 설정 합 니 다.
의뢰 대상:
#import <Foundation/Foundation.h>
#import "BNRLogger.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
BNRLogger *logger=[[BNRLogger alloc]init];
//URL
NSURL *url = [NSURL URLWithString:@"http://image.baidu.com/search/down?tn=download&ipn=dwnl&word=download&ie=utf8&fr=result&url=http%3A%2F%2Fimg.xiazaizhijia.com%2Fuploads%2F2016%2F0914%2F20160914112151862.jpg&thumburl=http%3A%2F%2Fimg4.imgtn.bdimg.com%2Fit%2Fu%3D2349180720%2C2436282788%26fm%3D11%26gp%3D0.jpg"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
__unused NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:logger delegateQueue:[NSOperationQueue mainQueue]];
__unused NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:2.0 target:logger selector:@selector(updateLastTime:) userInfo:nil repeats:YES];
//4. Task( )
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
//5.
[dataTask resume];
[[NSRunLoop currentRunLoop]run];
}
return 0;
}
BNRLogger.h 에서 NSURLSessionDataDelegate 프로 토 콜 을 설명 합 니 다.
#import <Foundation/Foundation.h>
@interface BNRLogger : NSObject<NSURLSessionDataDelegate>
@property (nonatomic, strong) NSMutableData *responseData;
@property(nonatomic) NSDate *lastTime;
-(NSString *) lastTimeString;
-(void)updateLastTime: (NSTimer *) t;
@end
BNRLogger.m 에는 NSURLSession 의 에이전트 방법 이 있 습 니 다.구체 적 으로 NSURLSession 을 볼 수 있 습 니 다.
#import "BNRLogger.h"
@implementation BNRLogger
-(NSMutableData *)responseData
{
if (_responseData == nil) {
_responseData = [NSMutableData data];
}
return _responseData;
}
-(NSString *)lastTimeString
{
static NSDateFormatter *dateFormatter=nil;
if(!dateFormatter)
{
dateFormatter =[[NSDateFormatter alloc]init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSLog(@"created dateFormatter");
}
return [dateFormatter stringFromDate:self.lastTime];
}
-(void)updateLastTime:(NSTimer *)t
{
NSDate *now=[NSDate date];
[self setLastTime:now];
NSLog(@"Just set time to %@",self.lastTimeString);
}
//1.
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
// , response
NSLog(@"didReceiveResponse--%@",[NSThread currentThread]);
NSLog(@" ");
// : completionHandler
//
/*
NSURLSessionResponseCancel = 0, ,
NSURLSessionResponseAllow = 1,
NSURLSessionResponseBecomeDownload = 2,
NSURLSessionResponseBecomeStream
*/
completionHandler(NSURLSessionResponseAllow);
}
//2. ,
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"didReceiveData--%@",[NSThread currentThread]);
NSLog(@" ");
//
[self.responseData appendData:data];
}
//3. ( | ) , , error
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"didCompleteWithError--%@",[NSThread currentThread]);
NSLog(@" ");
if(error == nil)
{
//
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:nil];
NSLog(@"%@",dict);
}
}
@end
통지 하 다.시스템 시간 대 에 변화 가 발생 하면 알림 센터 에 NSSystem TimeZoned Did Change Notification 알림 을 발표 한 다음 알림 센터 에서 해당 알림 을 해당 관찰자 에 게 전달 합 니 다.
main.m 에서 BNRLogger 인 스 턴 스 를 관찰자 로 등록 하고 시스템 시간 대 설정 에 변화 가 생기 면 해당 하 는 통 지 를 받 을 수 있 습 니 다.
// ” ” main.m
[[NSNotificationCenter defaultCenter]addObserver:logger selector:@selector(zoneChange:) name:NSSystemTimeZoneDidChangeNotification object:nil];
BNRLogger.m 에서 이 방법 을 실현 합 니 다:
// ” ” BNRLogger.m
-(void)zoneChange:(NSNotification *)note
{
NSLog(@"The system time zone has changed!");
}
차단 반전위 에서 말 한"알림"방법 을 응용 프로그램 main.m 에서:
[[NSNotificationCenter defaultCenter]addObserver:logger selector:@selector(zoneChange:) name:NSSystemTimeZoneDidChangeNotification object:nil];
다음으로 변경:
[[NSNotificationCenter defaultCenter]addObserverForName:NSSystemTimeZoneDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note){
NSLog(@"The system time zone has changed!");
}];
"알림"방법 프로그램 BNRLogger.m 에서 이 방법 을 삭제 합 니 다.
-(void)zoneChange:(NSNotification *)note
{
NSLog(@"The system time zone has changed!");
}
총결산4.567917.한 가지 일 만 하 는 대상(예 를 들 어)에 대해 목표-동작 을 사용 합 니 다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.