简介

知乎日报的第三方 iOS 客户端,没有第三方库依赖,使用 Objective-C 语言实现。 第一个 iOS 项目,轻拍...

API 来源: 知乎日报 API 分析 Github: Seanwong933/zhihuDaily

所用技术

  1. MVC
  2. GCD
  3. 自定义 tableview cell
  4. 图片轮播插件
  5. 持久化缓存
  6. UI Animation
  7. Objective-C Runtime 特性
  8. Instruments 的 Leaks 调试经验

项目演示

开发时长

八天

经验总结(坑)

一. 异步操作中想操作界面记住先返回主线程

+ (void)requestWithUrl:(NSString*)url
            completion:(void (^)(id data, NSString* md5))completion
{
  NSURLSession* session = [NSURLSession sharedSession];
  NSURL* requestURL = [NSURL URLWithString:url];

  [[session
      dataTaskWithURL:requestURL
    completionHandler:^(NSData* data, NSURLResponse* response, NSError* error) {
      [[GCDUtil globalQueueWithLevel:DEFAULT] async:^{
        NSHTTPURLResponse* responseFromServer = (NSHTTPURLResponse*)response;
        if (data != nil && error == nil &&
            responseFromServer.statusCode == 200) {
          NSError* parseError = nil;
          id result = [NSJSONSerialization JSONObjectWithData:data
                                                      options:0
                                                        error:&parseError];
          NSString* json =
            [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
          NSString* md5 = [MD5Util MD5ByAStr:json];
          if (parseError)
            return;
          if (completion != nil) {
            [[GCDUtil mainQueue] async:^{
              completion(result, md5);
            }];
          }
        }
      }];
    }] resume];
}

二. 自定义的控制器和视图可能需要注意手动控制释放 三. 若有必要操作系统控件时,可以使用 OC 的运行时特性进行 Hack 四. 项目中需缓存的对象类别大于一时,请老老实实的使用 Coredata 或 Sqlite 进行数据持久化。 五. 网络图片缓存时需要压缩 六. 常量尽量使用static TYPE const进行声明,这样的常量好处是有类型信息 七. 在跳转拥有 sb 的控制器时,确保在跳转前加载了该 sb

UIStoryboard* storyboard =
    [UIStoryboard storyboardWithName:@"Main" bundle:nil];
  UINavigationController* viewController = [storyboard
    instantiateViewControllerWithIdentifier:@"RootNavigationController"];
  AppDelegate* delegate = [UIApplication sharedApplication].delegate;
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)),
                 dispatch_get_main_queue(), ^{
                   [delegate changeRootViewController:viewController
                                              animate:true];
                 });

八. 需要在块中改变其值的局部变量需要加上__block说明符 九. 为视图设置约束时,确保其translatesAutoresizingMaskIntoConstraints = false 十. 想起来再写