рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдореЗрдВ рд╕рд░рд▓ рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдз рдореЙрдХрд┐рдВрдЧ + рдпреВрдирд┐рдЯ-рдкрд░реАрдХреНрд╖рдг рдмреНрд▓реЙрдХ рдХреЙрд▓рдмреИрдХ

рдХреНрдпреЛрдВ

1. рдХреНрдпреЛрдВ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрдЧрд╣?
рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕реЗ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдорд░реНрдердХ рд░рд╣реВрдВрдЧрд╛ рдЬрдм рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рдбреЛрдореЗрди рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рдФрд░ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрджрд┐ рдПрдкреАрдЖрдИ рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ, рддреЛ рдмреИрдХ-рдПрдВрдб рдХреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдореЗрд░реЗ рдЖрдИрдУрдПрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдлрд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ред

2. рдХреНрдпреЛрдВ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓рдХреНрд╖реНрдп-рдХрд╛рд░реНрд░рд╡рд╛рдИ, рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдФрд░ рдЗрддрдиреЗ рдкрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ?
рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, рд▓рдЧрднрдЧ рд╕рднреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЙрд▓рдмреИрдХ рд╣реЛрдВрдЧреЗ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдмреНрд▓реЙрдХ рд╕реНрдЯрд╛рдЗрд▓рд┐рд╢, рдлреИрд╢рдиреЗрдмрд▓, рдпреБрд╡рд╛ рд╣реИрдВ!

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг

рд╣рдо рд▓реЗрдЦ рдХреЛ рд╡рд┐рд╕реНрддреГрдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╛рдардХреЛрдВ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрднреА рднреА рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ (AuthorizeWithLogin ... рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рд╣реИ):

- (void)testMyAwesomeAPI { [api authorizeWithLogin:kLogin password:kPassword completion:^(NSString *nickname) { STAssertTrue([nickname isEqualToString:@"John"], @""); //code } error:^(NSError *error) { STAssertTrue(false, @""); //code }]; } 

рдСрдкрд░реЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдореБрдЭреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд 'рдорд╛рд░рд┐рди рдЯреЛрдбреЛрд░реЛрд╡' рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдЖрдпрд╛ред рдЗрд╕рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╡рд░реНрдЧ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 #import <Foundation/Foundation.h> @interface TestSemaphor : NSObject @property (strong, atomic) NSMutableDictionary* flags; + (TestSemaphor *)sharedInstance; - (BOOL)isLifted:(NSString*)key; - (void)lift:(NSString*)key; - (BOOL)waitForKey:(NSString*)key; - (BOOL)waitForKey:(NSString *)key timeout:(NSTimeInterval)timeout; @end 


 #import "TestSemaphor.h" @implementation TestSemaphor @synthesize flags; +(TestSemaphor *)sharedInstance { static TestSemaphor *sharedInstance = nil; static dispatch_once_t once; dispatch_once(&once, ^{ sharedInstance = [TestSemaphor alloc]; sharedInstance = [sharedInstance init]; }); return sharedInstance; } - (id)init { self = [super init]; if (self != nil) { self.flags = [NSMutableDictionary dictionary]; } return self; } - (BOOL)isLifted:(NSString*)key { return [self.flags objectForKey:key] != nil; } - (void)lift:(NSString*)key { [self.flags setObject:@"YES" forKey:key]; } - (BOOL)waitForKey:(NSString *)key timeout:(NSTimeInterval)timeout { BOOL keepRunning; NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeout]; do { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeoutDate]; keepRunning = ![[TestSemaphor sharedInstance] isLifted:key]; if([timeoutDate timeIntervalSinceNow] < 0.0) { [self lift:key]; return NO; } } while (keepRunning); return YES; } - (BOOL)waitForKey:(NSString*)key { return [self waitForKey:key timeout:10.0]; } @end 

рд╣рдо рд▓рд┐рдлреНрдЯ рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ : рдФрд░ waForKey: рддрд░реАрдХреЗред рдЪрд▓реЛ рд╕реАрдзреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВ:

 NSString *key = [NSString UUID]; [api authorizeWithLogin:kLogin password:kPassword completion:^(NSString *nickname) { STAssertTrue([nickname isEqualToString:@"John"], @""); [[TestSemaphor sharedInstance] lift:key]; //code } error:^(NSError *error) { STAssertTrue(false, @""); //code }]; STAssertTrue([[TestSemaphor sharedInstance] waitForKey:key], @"Failed due timeout"); 

TestMyAwesomeAPI рд╡рд┐рдзрд┐ рдКрдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рддрдм рддрдХ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдкреВрд░реНрдг рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ
рдпреВрдпреВрдЖрдИрдбреА - рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП 'рдХреБрдВрдЬреА'ред

рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛, рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдХрд╖реНрдЯрдкреНрд░рдж рд╕рдорд╕реНрдпрд╛ рд╣реИ - рдЕрдЧрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рд░реНрд╡рд░-рд╕реНрд╡рддрдВрддреНрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг

рд╕рд░реНрд╡рд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЙрди рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдЬреЛ рдореБрдЭреЗ рдХрднреА рдорд┐рд▓реЗ рд╣реИрдВ рд╡рд╣ рд╣реИ OHHTTPStubs ред рдкрд░рдВрдкрд░рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреБрдЫ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрд╕ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реИ):

 - (void)testMyAwesomeAPI { [OHHTTPStubs addRequestHandler:^OHHTTPStubsResponse*(NSURLRequest *request, BOOL onlyCheck) { return [OHHTTPStubsResponse responseWithFile:@"login.json" contentType:@"text/json" responseTime:0.0]; }]; NSString *key = [NSString UUID]; [api authorizeWithLogin:kLogin password:kPassword completion:^(NSString *nickname) { STAssertTrue([nickname isEqualToString:@"John"], @""); [[TestSemaphor sharedInstance] lift:key]; //code } error:^(NSError *error) { STAssertTrue(false, @""); //code }]; STAssertTrue([[TestSemaphor sharedInstance] waitForKey:key], @"Failed due timeout"); } 

рд╡рд╣ рд╕рдм рд╣реИ! рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬрд╡рд╛рдм рдореЗрдВ рд╣рдореЗрдВ login.json рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдорд┐рд▓реЗрдЧреАред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, OHHTTPStubs рдЙрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХрд╛рдлреА рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдХреА рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬрд╝: OHHTTPStubs рдирд┐рдЬреА API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред

рд╡рд╣ рд╕рдм рд╣реИред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/In164073/


All Articles