Skip to content

Instantly share code, notes, and snippets.

@VincentSit
Created March 27, 2015 09:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save VincentSit/dac6f7fb0f36358f2ef6 to your computer and use it in GitHub Desktop.
Save VincentSit/dac6f7fb0f36358f2ef6 to your computer and use it in GitHub Desktop.

我个人属于代码洁癖型选手,个人挑一些小毛病,如下:

1、方法名命名不规范,应该为 - (void)getMatchesListWithHolder:(UIView *)holder success:(void(^)(NSArray *dic))success; ,success 是小写。

2、Block 参数变量名不规范。类型是 NSArray,变量名却写 dic

3、单例命名不规范,单例通常应该命名为 sharedXXX,例如 [NSURLSession sharedSession]

4、回调只有成功回调,没有失败的回调,如果请求失败了,那么回调就不会被执行。

5、违反 MVC 设计模式。最好不要把 View 传进 Model,如果是要取 View 的参数就传这些参数,如果是要对 View 操作就在 Controller 的回调里操作。

6、应该子类化 AFNetworking 为一个单例网络请求类,做一些必要的额外设置,提供 baseURL 以便于请求时只输入 URI 即可,而不同写完整的 URL。

7、请求的 URI 地址命名没有含义,不利于识别。

8、使用一句代码取层次较深的数据容易出错。并且应该使用字面量(这样做的好处请自行 Google)。

9、没有对 success 回调做判断,如果调用者传入 nil,那么你调用 success 会造成 Crash。

10、如果你的服务器使用 HTTP 错误码标识网络请求错误,那么 API 请求错误就肯定是使用 2XX 的状态码。而在 iOS 网络请求中 2XX 是表示成功的请求,那么此时你的 responseObject 是存在的,但是它是一个错误的数据,你简单的使用 if 判断这个对象是否存在来判断请求成功失败,这样做是有风险的。

11、这个属于我个人的习惯,我认为方法的类型也应该是有区别的。类方法(+)应该是对整个模型层面的操作,实例方法(-)是对某单个模型的操作。例如有一个朋友圈类,发布朋友圈或者加载我的朋友圈应该是封装成类方法,对某一条朋友圈评论或赞应该封装成实例方法。又如有一个用户类,请求附近的用户,应该写成类方法,更新当前用户的资料,应该写成实例方法。如果按照我的这个逻辑,你的方法类型就不对了。

我个人封装网络请求类似于这样:

我自己的服务器不管是网络错误还是请求错误都不会返回 2XX 的状态码,所以我只要是进了成功的回调,那么这个请求一定是成功了。

+ (NSURLSessionDataTask *)getAuthCodeWithPhoneNumber:(NSString *)phoneNumber completionHandler:(OPTCompletionBlock)completionHandler {
  NSString *URLString = [kGetAuthCodeURI stringByAppendingPathComponent:phoneNumber];
  return [[OPTEngine sharedEngine] GET:URLString parameters:nil
                               success:^(NSURLSessionDataTask *task, id responseObject) {
                                 !completionHandler ?: completionHandler(YES, nil);
                               } failure:^(NSURLSessionDataTask *task, NSError *error) {
                                 !completionHandler ?: completionHandler(NO, [OPTError errorWithResponseError:error]);
                               }];
}
typedef void (^OPTCompletionBlock)(BOOL success, NSError *error);

另外回调也分为两种,一种是成功和失败分别回调,一种是成功和失败同一个回调,使用 BOOL 或者 NSError 标识请求是否成功,我个人偏向使用同一个回调,因为有时候需要在成功和失败时调用相同的代码(例如隐藏 HUD)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment