Skip to content

Commit

Permalink
Fix #723
Browse files Browse the repository at this point in the history
* Add Aysnchronous RPC Request operation
* Add stub for Synchronous RPC Request operation
  • Loading branch information
joeljfischer committed Jan 31, 2018
1 parent 882aa24 commit d96f718
Show file tree
Hide file tree
Showing 12 changed files with 266 additions and 3 deletions.
24 changes: 24 additions & 0 deletions SmartDeviceLink-iOS.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -956,6 +956,10 @@
5DADA7781F4E059E0084D17D /* SDLRectangleSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DADA7771F4E059E0084D17D /* SDLRectangleSpec.m */; };
5DAE06731BDEC6C000F9B498 /* SDLFileSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DAE06721BDEC6C000F9B498 /* SDLFileSpec.m */; };
5DAE06751BDEC6D600F9B498 /* SDLArtworkSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DAE06741BDEC6D600F9B498 /* SDLArtworkSpec.m */; };
5DB16144202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DB16142202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.h */; };
5DB16145202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB16143202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.m */; };
5DB1616C2022276A00F310DF /* SDLSequentialRPCRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DB1616A2022276A00F310DF /* SDLSequentialRPCRequestOperation.h */; };
5DB1616D2022276A00F310DF /* SDLSequentialRPCRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1616B2022276A00F310DF /* SDLSequentialRPCRequestOperation.m */; };
5DB1BCD31D243A8E002FFC37 /* SDLDeleteFileOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCD01D243A8E002FFC37 /* SDLDeleteFileOperationSpec.m */; };
5DB1BCD41D243A8E002FFC37 /* SDLListFilesOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCD11D243A8E002FFC37 /* SDLListFilesOperationSpec.m */; };
5DB1BCD51D243A8E002FFC37 /* SDLUploadFileOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCD21D243A8E002FFC37 /* SDLUploadFileOperationSpec.m */; };
Expand Down Expand Up @@ -2183,6 +2187,10 @@
5DADA7771F4E059E0084D17D /* SDLRectangleSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLRectangleSpec.m; sourceTree = "<group>"; };
5DAE06721BDEC6C000F9B498 /* SDLFileSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLFileSpec.m; path = DevAPISpecs/SDLFileSpec.m; sourceTree = "<group>"; };
5DAE06741BDEC6D600F9B498 /* SDLArtworkSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLArtworkSpec.m; path = DevAPISpecs/SDLArtworkSpec.m; sourceTree = "<group>"; };
5DB16142202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLAysnchronousRPCRequestOperation.h; sourceTree = "<group>"; };
5DB16143202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAysnchronousRPCRequestOperation.m; sourceTree = "<group>"; };
5DB1616A2022276A00F310DF /* SDLSequentialRPCRequestOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSequentialRPCRequestOperation.h; sourceTree = "<group>"; };
5DB1616B2022276A00F310DF /* SDLSequentialRPCRequestOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSequentialRPCRequestOperation.m; sourceTree = "<group>"; };
5DB1BCD01D243A8E002FFC37 /* SDLDeleteFileOperationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDeleteFileOperationSpec.m; path = DevAPISpecs/SDLDeleteFileOperationSpec.m; sourceTree = "<group>"; };
5DB1BCD11D243A8E002FFC37 /* SDLListFilesOperationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLListFilesOperationSpec.m; path = DevAPISpecs/SDLListFilesOperationSpec.m; sourceTree = "<group>"; };
5DB1BCD21D243A8E002FFC37 /* SDLUploadFileOperationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLUploadFileOperationSpec.m; path = DevAPISpecs/SDLUploadFileOperationSpec.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2846,6 +2854,7 @@
5D1654571D3E79CA00554D93 /* Lifecycle */ = {
isa = PBXGroup;
children = (
5DB16141202115D900F310DF /* Request Operations */,
5D1654581D3E7A1600554D93 /* SDLLifecycleManager.h */,
5D1654591D3E7A1600554D93 /* SDLLifecycleManager.m */,
);
Expand Down Expand Up @@ -4211,6 +4220,17 @@
name = "Developer API Tests";
sourceTree = "<group>";
};
5DB16141202115D900F310DF /* Request Operations */ = {
isa = PBXGroup;
children = (
5DB16142202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.h */,
5DB16143202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.m */,
5DB1616A2022276A00F310DF /* SDLSequentialRPCRequestOperation.h */,
5DB1616B2022276A00F310DF /* SDLSequentialRPCRequestOperation.m */,
);
name = "Request Operations";
sourceTree = "<group>";
};
5DB1BCD61D243A91002FFC37 /* Operations */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -4892,6 +4912,7 @@
5D61FD331A84238C00846EE7 /* SDLPowerModeQualificationStatus.h in Headers */,
5D61FE011A84238C00846EE7 /* SDLVehicleDataNotificationStatus.h in Headers */,
5D61FDC91A84238C00846EE7 /* SDLTextField.h in Headers */,
5DB16144202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.h in Headers */,
5D6F7A351BC5B9B60070BF37 /* SDLLockScreenViewController.h in Headers */,
DA9F7E7F1DCC028B00ACAE48 /* SDLOnWayPointChange.h in Headers */,
5D61FCE41A84238C00846EE7 /* SDLKeyboardProperties.h in Headers */,
Expand Down Expand Up @@ -4926,6 +4947,7 @@
1E5AD04C1F1F79640029B8AF /* SDLDefrostZone.h in Headers */,
1E5AD0601F207AB10029B8AF /* SDLRadioState.h in Headers */,
1E5AD0801F20B73E0029B8AF /* SDLButtonPress.h in Headers */,
5DB1616C2022276A00F310DF /* SDLSequentialRPCRequestOperation.h in Headers */,
1E5AD05C1F2064A80029B8AF /* SDLRDSData.h in Headers */,
1E5AD0341F1F3AA30029B8AF /* SDLRemoteControlCapabilities.h in Headers */,
5DA102A41D4122C700C15826 /* NSMutableDictionary+SafeRemove.h in Headers */,
Expand Down Expand Up @@ -5438,6 +5460,7 @@
DA9F7E681DCBFAD400ACAE48 /* SDLOasisAddress.m in Sources */,
5D61FC7B1A84238C00846EE7 /* SDLDeleteInteractionChoiceSet.m in Sources */,
5D61FDC01A84238C00846EE7 /* SDLSystemRequest.m in Sources */,
5DB1616D2022276A00F310DF /* SDLSequentialRPCRequestOperation.m in Sources */,
5D61FD021A84238C00846EE7 /* SDLOnAudioPassThru.m in Sources */,
5D61FCE51A84238C00846EE7 /* SDLKeyboardProperties.m in Sources */,
5DBF062E1E64A93A00A5CF03 /* SDLLogFilter.m in Sources */,
Expand Down Expand Up @@ -5516,6 +5539,7 @@
5D1665C51CF8CA2700CC4CA1 /* SDLListFilesOperation.m in Sources */,
8B9376D81F3349FC009605C4 /* SDLMetadataTags.m in Sources */,
5D61FE021A84238C00846EE7 /* SDLVehicleDataNotificationStatus.m in Sources */,
5DB16145202115FC00F310DF /* SDLAysnchronousRPCRequestOperation.m in Sources */,
5D61FDD81A84238C00846EE7 /* SDLTouchType.m in Sources */,
DA4F47961E771AA100FC809E /* SDLEnum.m in Sources */,
5D61FDD61A84238C00846EE7 /* SDLTouchEventCapabilities.m in Sources */,
Expand Down
20 changes: 20 additions & 0 deletions SmartDeviceLink/SDLAysnchronousRPCRequestOperation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// SDLRPCRequestOperation.h
// SmartDeviceLink
//
// Created by Joel Fischer on 1/30/18.
// Copyright © 2018 smartdevicelink. All rights reserved.
//

#import <UIKit/UIKit.h>

#import "SDLAsynchronousOperation.h"
#import "SDLLifecycleManager.h"

@protocol SDLConnectionManagerType;

@interface SDLAysnchronousRPCRequestOperation : SDLAsynchronousOperation

- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager requests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler;

@end
113 changes: 113 additions & 0 deletions SmartDeviceLink/SDLAysnchronousRPCRequestOperation.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
//
// SDLRPCRequestOperation.m
// SmartDeviceLink
//
// Created by Joel Fischer on 1/30/18.
// Copyright © 2018 smartdevicelink. All rights reserved.
//

#import "SDLAysnchronousRPCRequestOperation.h"

#import "SDLConnectionManagerType.h"
#import "SDLError.h"

@interface SDLAysnchronousRPCRequestOperation ()

@property (copy, nonatomic) NSArray<SDLRPCRequest *> *requests;
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (assign, nonatomic, nullable) SDLMultipleRequestProgressHandler progressHandler;
@property (assign, nonatomic, nullable) SDLMultipleRequestCompletionHandler completionHandler;
@property (assign, nonatomic) BOOL sequential;

@property (assign, nonatomic) NSUInteger requestsComplete;
@property (assign, nonatomic, readonly) float percentComplete;
@property (assign, nonatomic) BOOL requestFailed;

@end

@implementation SDLAysnchronousRPCRequestOperation {
BOOL executing;
BOOL finished;
}

- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager requests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(SDLMultipleRequestProgressHandler)progressHandler completionHandler:(SDLMultipleRequestCompletionHandler)completionHandler {
self = [super init];
if (!self) { return nil; }

executing = NO;
finished = NO;

_requests = requests;
_progressHandler = progressHandler;
_completionHandler = completionHandler;

_requestsComplete = 0;

return self;
}

- (void)start {
[super start];

[self sdl_sendRequests];
}

- (void)sdl_sendRequests {
for (SDLRPCRequest *request in self.requests) {
if (self.isCancelled) {
if (self.completionHandler != NULL) {
self.completionHandler(NO);
}

break;
}

[self sdl_sendRequest: request];
}
}

- (void)sdl_sendRequest:(SDLRPCRequest *)request {
[self.connectionManager sendManagerRequest:request withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
self.requestsComplete++;

if (self.progressHandler != NULL) {
BOOL cancelled = self.progressHandler(request, response, error, self.percentComplete);

// If this request failed and no request has yet failed, set our internal request failed to YES
if (!self.requestFailed && error != nil) {
self.requestFailed = YES;
}

// If the user decided to cancel, cancel for our next go around.
if (cancelled) {
[self cancel];
return;
}
}

// If we've received responses for all requests, call the completion handler.
if (self.requestsComplete == self.requests.count) {
if (self.completionHandler != NULL) {
self.completionHandler(self.requestFailed);
}
}
}];
}

#pragma mark - Getters

- (float)percentComplete {
return self.requestsComplete / self.requests.count;
}

#pragma mark - Property Overrides

- (nullable NSString *)name {
return [NSString stringWithFormat:@"%@ RPC Sending – %lu RPCs", (self.sequential ? @"Sequential" : @"Non-Sequential"), self.requests.count];
}

- (NSOperationQueuePriority)queuePriority {
return NSOperationQueuePriorityNormal;
}

@end
1 change: 1 addition & 0 deletions SmartDeviceLink/SDLError.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ extern SDLErrorDomain *const SDLErrorDomainFileManager;
+ (NSError *)sdl_lifecycle_startedWithBadResult:(SDLResult)result info:(NSString *)info;
+ (NSError *)sdl_lifecycle_startedWithWarning:(SDLResult)result info:(NSString *)info;
+ (NSError *)sdl_lifecycle_failedWithBadResult:(SDLResult)result info:(NSString *)info;
+ (NSError *)sdl_lifecycle_multipleRequestsCancelled;

#pragma mark SDLFileManager

Expand Down
6 changes: 6 additions & 0 deletions SmartDeviceLink/SDLError.m
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,12 @@ + (NSError *)sdl_lifecycle_failedWithBadResult:(SDLResult)result info:(NSString
userInfo:userInfo];
}

+ (NSError *)sdl_lifecycle_multipleRequestsCancelled {
return [NSError errorWithDomain:SDLErrorDomainLifecycleManager
code:SDLManagerErrorCancelled
userInfo:nil];
}


#pragma mark SDLFileManager

Expand Down
6 changes: 5 additions & 1 deletion SmartDeviceLink/SDLErrorConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,11 @@ typedef NS_ENUM(NSInteger, SDLManagerError) {
/**
* Registering with the remote system was successful, but had a warning.
*/
SDLManagerErrorRegistrationSuccessWithWarning = -7
SDLManagerErrorRegistrationSuccessWithWarning = -7,
/**
* Request operations were cancelled before they could be sent
*/
SDLManagerErrorCancelled = -8
};

/**
Expand Down
7 changes: 6 additions & 1 deletion SmartDeviceLink/SDLLifecycleManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ extern SDLLifecycleState *const SDLLifecycleStateSettingUpHMI;
extern SDLLifecycleState *const SDLLifecycleStateUnregistering;
extern SDLLifecycleState *const SDLLifecycleStateReady;


typedef void (^SDLMultipleRequestCompletionHandler)(BOOL success);
typedef BOOL (^SDLMultipleRequestProgressHandler)(__kindof SDLRPCRequest *request, __kindof SDLRPCResponse *__nullable response, NSError *__nullable error, float percentComplete);
typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error);


Expand Down Expand Up @@ -122,6 +123,10 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error);
*/
- (void)sendRequest:(SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler;

- (void)sendRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler;

- (void)sendSequentialRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler;

@end

NS_ASSUME_NONNULL_END
10 changes: 9 additions & 1 deletion SmartDeviceLink/SDLLifecycleManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -405,13 +405,21 @@ - (void)sendRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nulla
[self sdl_sendRequest:request withResponseHandler:handler];
}

- (void)sendRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {

}

- (void)sendSequentialRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {

}

// Managers need to avoid state checking. Part of <SDLConnectionManagerType>.
- (void)sendManagerRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)block {
[self sdl_sendRequest:request withResponseHandler:block];
}

- (void)sdl_sendRequest:(SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
// We will allow things to be sent in a "SDLLifeCycleStateConnected" state in the private method, but block it in the public method sendRequest:withCompletionHandler: so that the lifecycle manager can complete its setup without being bothered by developer error
// We will allow things to be sent in a "SDLLifecycleStateConnected" state in the private method, but block it in the public method sendRequest:withCompletionHandler: so that the lifecycle manager can complete its setup without being bothered by developer error
NSParameterAssert(request != nil);

// If, for some reason, the request is nil we should error out.
Expand Down
37 changes: 37 additions & 0 deletions SmartDeviceLink/SDLManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,25 @@

NS_ASSUME_NONNULL_BEGIN

/**
A completion handler called after a sequential or simultaneous set of requests have completed sending.
@param success True if every request succeeded, false if any failed. See the progress handler for more details on failures.
*/
typedef void (^SDLMultipleRequestCompletionHandler)(BOOL success);

/**
A handler called after each response to a request comes in in a multiple request send.
@param request The request that received a response
@param response The response received
@param error The error that occurred during the request if any occurred.
@param percentComplete The percentage of requests that have received a response
@return Return NO to cancel any requests that have not yet been sent. This is really only useful for a sequential send (sendSequentialRequests:progressHandler:completionHandler:). Return YES to continue sending requests.
*/
typedef BOOL (^SDLMultipleRequestProgressHandler)(__kindof SDLRPCRequest *request, __kindof SDLRPCResponse *__nullable response, NSError *__nullable error, float percentComplete);


typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error);


Expand Down Expand Up @@ -129,6 +148,24 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error);
*/
- (void)sendRequest:(SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler NS_SWIFT_NAME(send(request:responseHandler:));

/**
Send all of the requests given as quickly as possible, but in order. Call the completionHandler after all requests have either failed or given a response.
@param requests The requests to be sent
@param progressHandler A handler called every time a response is received
@param completionHandler A handler to call when all requests have been responded to
*/
- (void)sendRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler;

/**
Send all of the requests one at a time, with the next one going out only after the previous one has received a response. Call the completionHandler after all requests have either failed or given a response.
@param requests The requests to be sent
@param progressHandler A handler called every time a response is received
@param completionHandler A handler to call when all requests have been responded to
*/
- (void)sendSequentialRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler NS_SWIFT_NAME(sendSequential(requests:progressHandler:completionHandler:));

@end

NS_ASSUME_NONNULL_END
8 changes: 8 additions & 0 deletions SmartDeviceLink/SDLManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@ - (void)sendRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nulla
[self.lifecycleManager sendRequest:request withResponseHandler:handler];
}

- (void)sendRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
[self sendRequests:requests progressHandler:progressHandler completionHandler:completionHandler];
}

- (void)sendSequentialRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
[self.lifecycleManager sendSequentialRequests:requests progressHandler:progressHandler completionHandler:completionHandler];
}

@end

NS_ASSUME_NONNULL_END
20 changes: 20 additions & 0 deletions SmartDeviceLink/SDLSequentialRPCRequestOperation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// SDLSequentialRPCRequestOperation.h
// SmartDeviceLink
//
// Created by Joel Fischer on 1/31/18.
// Copyright © 2018 smartdevicelink. All rights reserved.
//

#import <UIKit/UIKit.h>

#import "SDLAsynchronousOperation.h"
#import "SDLLifecycleManager.h"

@protocol SDLConnectionManagerType;

@interface SDLSequentialRPCRequestOperation : SDLAsynchronousOperation

- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager requests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler;

@end
17 changes: 17 additions & 0 deletions SmartDeviceLink/SDLSequentialRPCRequestOperation.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// SDLSequentialRPCRequestOperation.m
// SmartDeviceLink
//
// Created by Joel Fischer on 1/31/18.
// Copyright © 2018 smartdevicelink. All rights reserved.
//

#import "SDLSequentialRPCRequestOperation.h"

@implementation SDLSequentialRPCRequestOperation

- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager requests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {

}

@end

0 comments on commit d96f718

Please sign in to comment.