, , sendCommandAndWaitForResponse .
" " //. , NSOperation :
typedef void (^DataToStreamCopier_completion_t)(id result);
@interface DataToStreamCopier : NSOperation
- (id) initWithData:(NSData*)sourceData
destinationStream:(NSOutputStream*)destinationStream
completion:(DataToStreamCopier_completion_t)completionHandler;
@property (nonatomic) NSThread* workerThread;
@property (nonatomic, copy) NSString* runLoopMode;
@property (atomic, readonly) long long totalBytesCopied;
- (void) start;
- (void) cancel;
@property (nonatomic, readonly) BOOL isCancelled;
@property (nonatomic, readonly) BOOL isExecuting;
@property (nonatomic, readonly) BOOL isFinished;
@end
"" cancel.
sendCommandAndWaitForResponse: :
- (void)sendCommand:(NSData *)request
completion:(DataToStreamCopier_completion_t)completionHandler
{
DataToStreamCopier* op = [DataToStreamCopier initWithData:request
destinationStream:self.outputStream
completion:completionHandler];
[op start];
...
}
:
[self sendCommand:request completion:^(id result) {
if ([result isKindOfClass[NSError error]]) {
NSLog(@"Error: %@", error);
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
APDUResponse* response = result;
...
});
}
}];
:
, NSOperation , , , . concurrency, , , , .
, Run Loop NSOperation " ". , , / "", .
:
, NSOperation, NSOperationQueue. start - NSOperationQueue. , NSOperation, , NSOperation .
" ", , NSStream, , .
, , , start cancel, , .
, . : promises (. wiki promises).
, " " Promise , :
@interface WriteDataToStreamOperation : AsyncOperation
- (void) start;
- (void) cancel;
@property (nonatomic, readonly) BOOL isCancelled;
@property (nonatomic, readonly) BOOL isExecuting;
@property (nonatomic, readonly) BOOL isFinished;
@property (nonatomic, readonly) Promise* promise;
@end
"" - :
sendCommand :
. Promise:
- (Promise*) sendCommand:(NSData *)command {
WriteDataToStreamOperation* op =
[[WriteDataToStreamOperation alloc] initWithData:command
outputStream:self.outputStream];
[op start];
Promise* promise = op.promise;
[promise setTimeout:100];
return promise;
}
. "-". . , , . ( IF) , Promise. ( RXPromise, . ).
:
[self sendCommand:request].then(^id(APDUResponse* response) {
...
return ...;
},
^id(NSError*error) {
NSLog(@"Error: %@", error);
return nil;
});
:
- -. , sendCommand:.
- "":
Promise* promise = [self sendCommand:request];
[promise setTimeout:100];
promise.then(^id(APDUResponse* response) {
...
return ...;
},
^id(NSError*error) {
NSLog(@"Error: %@", error);
return nil;
});
"" - . , , .
, Unit Tests, :
""
"" ( ) . , Run Loop, , , , .
RXPromise, runLoopWait, , :
-(void) testSendingCommandShouldReturnResponseBeforeTimeout10 {
Promise* promise = [self sendCommand:request];
[promise setTimeout:10];
[promise.then(^id(APDUResponse* response) {
XCTAssertNotNil(response);
return ...;
},
^id(NSError*error) {
XCTestFail(@"failed with error: %@", error);
return nil;
}) runLoopWait];
}
runLoopWait , , . . , . , .
: testSendingCommandShouldReturnResponseBeforeTimeout10 , . , !
, "" .
"" . , , .
( Gist) , , Promises:
RXStreamToStreamCopier