参考

iOS 7 Best Practices; A Weather App Case Study: Part 1/2

iOS 7 Best Practices; A Weather App Case Study: Part 2/2

中文版

iOS 7最佳实践:一个天气App案例(一)

iOS 7最佳实践:一个天气App案例(二)

天气数据源 OpenWeatherMap

OpenWeatherMap API

源码

https://github.com/mobilefeng/SimpleWeather

2015.7.10

问题1

按照Demo,完成了90%,按理说,构建一般,可以获取到位置信息,并显示天气信息

但是实际运行后无变化

查到原因如下:

xcode 6 和 iOS 8 需要获取定位权限

解决办法:(参考 http://www.cocoachina.com/bbs/read.php?tid-259171.html   5楼的解答)

1、info.plist里加入对应的缺省字段 ,值设置为YES(前台定位写上边字段,前后台定位写下边字段)

NSLocationWhenInUseUsageDescription //允许在前台获取GPS的描述

NSLocationAlwaysUsageDescription //允许在前、后台获取GPS的描述

2、在 startUpdatingLocation 前面加上获取定位权限代码,系统版本高于8.0,则询问用户定位权限

- (void)findCurrentLocation {
self.isFirstUpdate = YES; if ([[[UIDevice currentDevice] systemVersion] doubleValue] > 8.0) {
// 前台定位
[self.locationManager requestWhenInUseAuthorization];
// 前后台同时定位
// [self.locationManager requestAlwaysAuthorization];
} [self.locationManager startUpdatingLocation];
}

问题2

修复问题1后,运行,控制台报如下错:

2015-07-10 21:22:03.060 SimpleWeather[10900:1844013] CUICatalog: Invalid asset name supplied: (null)

原因:

排查发现是下面代码出错:

 [[RACObserve([WXManager sharedManager], currentCondition)
deliverOn:RACScheduler.mainThreadScheduler]
subscribeNext:^(WXCondition *newCondition) {
temperatureLabel.text = [NSString stringWithFormat:@"%.0f°",newCondition.temperature.floatValue];
conditionsLabel.text = [newCondition.condition capitalizedString];
cityLabel.text = [newCondition.locationName capitalizedString]; iconView.image = [UIImage imageNamed:[newCondition imageName]];
}];

在第8行,执行到这一步时,发现newCondition是nil,导致image是空

但是为何newCondition会是nil,还在排查

暂时现在block中,加一层判断,

if (newCondition) {

// 执行text和image的操作

}

问题3

再次运行,报如下错误:

2015-07-10 22:49:54.014 SimpleWeather[11128:1866849] *** Assertion failure in -[MTLJSONAdapter initWithModelClass:], /Users/xuyang/Documents/05_iOSPractice/10_SimpleWeather/SimpleWeather/Pods/Mantle/Mantle/MTLJSONAdapter.m:149
2015-07-10 22:49:54.019 SimpleWeather[11128:1866849] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'windBearing is not a property of WXCondition.'

原因:

出错在:

if (![propertyKeys containsObject:mappedPropertyKey]) {
NSAssert(NO, @"%@ is not a property of %@.", mappedPropertyKey, modelClass);
return nil;
}

这里的 mappedPropertyKey 是从 WXCondition 中的 JSONKeyPathsByPropertyKey 中得到的

其中有一项 windBearing(从Demo抄的),在Pod里面没有,导致识别不出

将 windBearing 改成 windBear即可

2015.7.11

问题4

再次运行,天气数据未刷新,newConditon一直是nil

原因:

在原文的回复中有人也遇到这个问题,并给出了解答,是Mantle新的库引入的,解决方法是:

Great tutorial ! For those who is getting nil newCondition , you need to downgrade "Mantle" , as Bruce Li said it has defect in its latest version . Just close again Xcode , and modify Podfile in terminal as you did it in first part ,
pico Podfile
platform :ios, '7.0'
pod 'Mantle','1.3.1'
pod 'LBBlurredImage'
pod 'TSMessages'
pod 'ReactiveCocoa'
and then "pod install"

问题5

再次运行,提示

No known class method for selector 'transformerUsingForwardBlock:reverseBlock:

原因是,之前把Mantle更新到2.0.2(最新版),提示说原来的 reversibleTransformerWithForwardBlock:reverseBlock:不可用了

于是改用了新的方法,现在回退到1.3.1版本,故要用老方法

http://stackoverflow.com/questions/29594029/reversibletransformerwithforwardblock-is-deprecated

这里有关于这两个方法的说明

2015.7.12

问题6

现在显示的时间是0时区的时间,想要显示成北京时间(东八区)

方法:

在dateFormatter初始化时,设置一下时区

[_hourlyFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
[_dailyFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CH"]];

问题7

我将 dateFormat 设置成 @"HH:mm" 后,发现现实的时间,有些出现20:01或23:59这样的时间

原因:

// NSString <-> NSDate
+ (NSValueTransformer *)dateJSONTransformer {
return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *str) {
return [NSDate dateWithTimeIntervalSince1970:str.doubleValue];
} reverseBlock:^(NSDate *date) {
return [NSString stringWithFormat:@"%f", [date timeIntervalSince1970]];
}];
}

str.floatValue --> str.doubleValue

float精度不够,导致末位可能被四舍五入导致的

这个问题BDN APP中RD曾经犯过

SimpleWeather APP的更多相关文章

  1. 构建工具Gradle

    1.Summary   从Android团队开始宣布放弃Eclipse转投Android Studio时,构建工具Gradle进入了Android开发者的视野.而随着热修复.插件化.编译时注解的流行, ...

  2. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  3. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  4. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  5. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  6. SQLSERVER走起 APP隆重推出

    SQLSERVER走起 APP隆重推出 为方便大家查看本微信公众以前推送的文章,QQ群里面的某位SQLSERVER重度爱好者开发了<SQLSERVER走起>的APP 以供大家一起交流 网页 ...

  7. 从中间件的历史来看移动App开发的未来

    在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...

  8. 搞个这样的APP要多久?

    这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要 ...

  9. app开发外包注意事项,2017最新资讯

    我们见过很多创业者,栽在这app外包上.很多创业者对于app外包这件事情不是特别重视,以为将事情交给app外包公司就完事了,实际上不是的.无论是从选择app外包公司还是签订合同.售后维护等各方面都有许 ...

随机推荐

  1. 基础篇-环境变量 .bash_profile

    千里之行始于足下~~~ PGHOST或者PGHOSTADDR PGPORT PGDATABASE PGUSER PGPASSWORD(不推荐使用这个,推荐使用.pgpass)

  2. JAVA实训总结 :String

    String是特殊的类,与其他基本类型并不相同,是被java封装的类型 String底层组成对象为数组与字典(字符集编码表) String 类型的字符串是存储在JVM特别开辟的字符串常量池中   创建 ...

  3. 转 java ClassLoader

    http://blog.csdn.net/xyang81/article/details/7292380 http://www.ibm.com/developerworks/cn/java/j-lo- ...

  4. #13:人十我一Orz——6

    水题放送,写得依旧丑: #include <cstdio> #include <cstring> #include <cmath> #include <alg ...

  5. 修复在unix系统里的文件打开不能显示正常的颜色问题

    在mac上面看到mysql的配置文件的颜色永远是白色,为了让配置文件的颜色更加分明些,这个时候只需进入到home目录下新建一个.vimrc文件, vim  .vimrc set nu syntax o ...

  6. 基于.net core微服务(Consul、Ocelot、Docker、App.Metrics+InfluxDB+Grafana、Exceptionless、数据一致性、Jenkins)

    1.微服务简介 一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(RESTfu ...

  7. 转:php中的匿名函数和闭包(closure)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  8. [在读]HTML5数据推送应用开发

    最近买的,讲SSE的,才看完前2章.

  9. AJPFX分享java排序之希尔排序

    (1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每 ...

  10. leetcode378 Kth Smallest Element in a Sorted Matrix

    思路1: 使用堆. 实现: class Solution { public: int kthSmallest(vector<vector<int>>& matrix, ...