Skip to content

Commit 3485d8d

Browse files
committed
Enhance parameter packers. Added transformValue to handle case like transforming NSArray to comma separated string.
1 parent bdc07c0 commit 3485d8d

File tree

3 files changed

+68
-29
lines changed

3 files changed

+68
-29
lines changed

STNetTaskQueue/STHTTPNetTask.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ typedef NS_ENUM(NSUInteger, STHTTPNetTaskResponseType) {
5555

5656
@optional
5757

58+
/**
59+
Transform a value to another.
60+
Use case: NSArray need to be transformed to comma separated string.
61+
62+
@param value id Value to be transformed
63+
@return id The transformed value. Should return the same value if "value" is not supposed to be transformed.
64+
*/
65+
- (id)transformValue:(id)value;
66+
5867
/**
5968
Separator string which should be used when packing parameters.
6069
E.g. property schoolName will be converted to school_name.

STNetTaskQueue/STHTTPNetTaskParametersPacker.m

Lines changed: 58 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -61,26 +61,11 @@ - (NSDictionary *)parametersFromRequestObject:(id<STHTTPNetTaskRequestObject>)re
6161
continue;
6262
}
6363

64-
id propertyValue = [(NSObject *)requestObject valueForKey:propertyName];
65-
if ([propertyValue conformsToProtocol:@protocol(STHTTPNetTaskRequestObject)]) {
66-
[parameters addEntriesFromDictionary:[self parametersFromRequestObject:propertyValue]];
67-
}
68-
else if ([propertyValue isKindOfClass:[NSDictionary class]]) {
69-
[parameters addEntriesFromDictionary:propertyValue];
70-
}
71-
else {
72-
if (![propertyValue isKindOfClass:[NSNumber class]] &&
73-
![propertyValue isKindOfClass:[NSString class]] &&
74-
![propertyValue isKindOfClass:[NSArray class]]) {
75-
continue;
76-
}
77-
78-
NSString *separator = STHTTPNetTaskRequestObjectDefaultSeparator;
79-
if ([requestObject respondsToSelector:@selector(parameterNameSeparator)]) {
80-
separator = [requestObject parameterNameSeparator];
81-
}
82-
NSString *parameterName = [self parameterNameOfProperty:propertyName withSeparator:separator];
83-
parameters[parameterName] = propertyValue;
64+
NSString *separator = [self separatorFromRequestObject:requestObject];
65+
NSString *parameterName = [self parameterNameFromName:propertyName withSeparator:separator];
66+
id parameterValue = [self parameterValueFromValue:[(NSObject *)requestObject valueForKey:propertyName] inRequestObject:requestObject];
67+
if (parameterName && parameterValue) {
68+
parameters[parameterName] = parameterValue;
8469
}
8570
}
8671

@@ -89,23 +74,53 @@ - (NSDictionary *)parametersFromRequestObject:(id<STHTTPNetTaskRequestObject>)re
8974
return parameters;
9075
}
9176

92-
- (BOOL)shouldPackPropertyWithAttributes:(NSArray *)attributes
77+
- (NSDictionary *)parametersFromDictionary:(NSDictionary *)dictionary inRequestObject:(id<STHTTPNetTaskRequestObject>)requestObject
9378
{
94-
// Only pack non-readonly property
95-
return ![attributes containsObject:@"R"];
79+
NSString *separator = [self separatorFromRequestObject:requestObject];
80+
NSMutableDictionary *parameters = [NSMutableDictionary new];
81+
for (NSString *key in dictionary) {
82+
NSString *parameterName = [self parameterNameFromName:key withSeparator:separator];
83+
id parameterValue = [self parameterValueFromValue:dictionary[key] inRequestObject:requestObject];
84+
if (parameterName && parameterValue) {
85+
parameters[parameterName] = parameterValue;
86+
}
87+
}
88+
return parameters;
89+
}
90+
91+
- (id)parameterValueFromValue:(id)value inRequestObject:(id<STHTTPNetTaskRequestObject>)requestObject
92+
{
93+
if ([requestObject respondsToSelector:@selector(transformedValue:)]) {
94+
id transformedValue = [requestObject transformValue:value];
95+
if (transformedValue != value) {
96+
return transformedValue;
97+
}
98+
}
99+
if ([value conformsToProtocol:@protocol(STHTTPNetTaskRequestObject)]) {
100+
return [self parametersFromRequestObject:value];
101+
}
102+
else if ([value isKindOfClass:[NSDictionary class]]) {
103+
return [self parametersFromDictionary:value inRequestObject:requestObject];
104+
}
105+
else if ([value isKindOfClass:[NSNumber class]] ||
106+
[value isKindOfClass:[NSString class]] ||
107+
[value isKindOfClass:[NSArray class]]) {
108+
return value;
109+
}
110+
return nil;
96111
}
97112

98-
- (NSString *)parameterNameOfProperty:(NSString *)propertyName withSeparator:(NSString *)separator
113+
- (NSString *)parameterNameFromName:(NSString *)name withSeparator:(NSString *)separator
99114
{
100115
if (!separator) {
101-
return propertyName;
116+
return name;
102117
}
103118

104119
NSMutableString *parameterName = [NSMutableString new];
105-
const char *chars = propertyName.UTF8String;
106-
for (NSUInteger i = 0; i < propertyName.length; i++) {
120+
const char *chars = name.UTF8String;
121+
for (NSUInteger i = 0; i < name.length; i++) {
107122
BOOL hasPrevious = i != 0;
108-
BOOL hasNext = i + 1 < propertyName.length;
123+
BOOL hasNext = i + 1 < name.length;
109124
BOOL prependUnderscore = NO;
110125
char ch = chars[i];
111126
if (isupper(ch)) {
@@ -132,4 +147,19 @@ - (NSString *)parameterNameOfProperty:(NSString *)propertyName withSeparator:(NS
132147
return [NSString stringWithString:parameterName];
133148
}
134149

150+
- (NSString *)separatorFromRequestObject:(id<STHTTPNetTaskRequestObject>)requestObject
151+
{
152+
NSString *separator = STHTTPNetTaskRequestObjectDefaultSeparator;
153+
if ([requestObject respondsToSelector:@selector(parameterNameSeparator)]) {
154+
separator = [requestObject parameterNameSeparator];
155+
}
156+
return separator;
157+
}
158+
159+
- (BOOL)shouldPackPropertyWithAttributes:(NSArray *)attributes
160+
{
161+
// Only pack non-readonly property
162+
return ![attributes containsObject:@"R"];
163+
}
164+
135165
@end

STNetTaskQueue/STHTTPNetTaskQueueHandler.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didComp
222222
code:0
223223
userInfo:@{ STHTTPNetTaskErrorStatusCodeUserInfoKey: @(httpResponse.statusCode),
224224
STHTTPNetTaskErrorResponseDataUserInfoKey: data }];
225-
[STNetTaskQueueLog log:_task.description];
225+
[STNetTaskQueueLog log:@"\n%@", _task.description];
226226
}
227227
[_queue task:_task didFailWithError:error];
228228
}

0 commit comments

Comments
 (0)