iOS 4 가지 리 셋 방법 요약

9536 단어 iOS리 턴 방법
최근 에 IOS 프로젝트 를 하 다가 리 셋 을 당 했 습 니 다.시간 을 내 서 관련 자 료 를 정리 하고 다음은 정리 내용 입 니 다.
리 턴
리 셋 은 실행 가능 한 코드 와 특정한 이 벤트 를 연결 하 는 것 입 니 다.특정한 사건 이 발생 하면 이 코드 를 실행 합 니 다.
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.한 가지 일 만 하 는 대상(예 를 들 어)에 대해 목표-동작 을 사용 합 니 다
  • 기능 이 더 복잡 한 대상(예 를 들 어 NSURLSession)에 대해 보조 대상 을 사용한다.가장 흔히 볼 수 있 는 보조 대상 유형 은 의뢰 대상 이다
  • 여러 개(다른 대상 중의)리 셋 을 촉발 할 대상(예 를 들 어 NSTimeZone)에 대해 알림 을 사용 합 니 다
  • Block 은 코드 를 쉽게 읽 을 수 있 도록 리 셋 을 실현 합 니 다
  • 읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기