作为一个从C#转到Swift的小菜鸡。。。最近做一个简单的请求API解析Json数据的小程序上碰到一堆小问题。尤其是在异步请求的时候,用惯了C#的async/await写法,在写Swift的时候也按着这个逻辑来做。结果发现回调函数没执行就直接返回了一个空数据出去导致程序一直崩溃(马丹啊)。查了老半天、问了一大堆人最后一个群友的一句话把我点醒了。。。。

  Swift的回调函数异步执行,它并没有C#的await来等待它执行完,它是直接往下执行程序的,这个时候你的回调函数并没有执行完。所以不能像C#那样用await等待异步操作把数据返回出来,然后对这个数据进行操作。而应该是把你对数据的处理方法用一个Closure传进异步方法里去。下面Po上我的错误代码和修改正确后的代码

✅正确代码:

WeatherDataSource.GetWeather("北京") { (weatherdata) in
NSLog(weatherdata.showapiResBody.cityInfo.c3 + "天气信息:" + weatherdata.showapiResBody.now.weather)
} static func GetWeather(cityName:String,callback:(weatherdata:WeatherRootClass)->Void){
let request = ShowApiRequest(url: "https://route.showapi.com/9-2", appId: AppInfo.appId, secret: AppInfo.secret)
request.post(["area":"北京"], callback: { (data) -> Void in
let weatherinfo = WeatherRootClass(fromDictionary: data)
NSLog(weatherinfo.showapiResBody.cityInfo.c3 + "天气信息:" + weatherinfo.showapiResBody.now.weather)
callback(weatherdata: weatherinfo)
})
}

❌错误代码:

        var weatherinfo = WeatherRootClass()
weatherinfo = WeatherDataSource.errorGetWeather("北京")
NSLog(weatherinfo.showapiResBody.cityInfo.c3 + "天气信息:" + weatherinfo.showapiResBody.now.weather) static func errorGetWeather(cityName:String) -> WeatherRootClass{
var result = WeatherRootClass()
let request = ShowApiRequest(url: "https://route.showapi.com/9-2", appId: AppInfo.appId, secret: AppInfo.secret)
request.post(["area":"北京"], callback: { (data) -> Void in
let weatherinfo = WeatherRootClass(fromDictionary: data)
result = weatherinfo
})
return result
}

还有一个小问题是String转化为NSURL时String内包含有中文转换出来的NSURL就为nil

对此的解决办法是:

str = str.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!

let nsurl =NSURL(string: str)!

将String使用NSUTF8转码,然后使用转码后的String转化为NSURL

C#与Swift异步操作的差异的更多相关文章

  1. Swift学习 (一)

    以后会自己总结学习Swift的笔记与深化.希望能够帮助已经有Objective-C经验的开发者更快地学习Swift.我们一起学习,同时也品味到Swift的精妙之处. 结论放在开头:我认为Swift比O ...

  2. fir.im Weekly - 94 个 iOS 开发资源推荐

    距离 2016 年还有 17 个日夜,而你和回家只隔了一张 12306 验证码的距离,祝大家抢票顺利.本期 fir.im Weekly 收集了一些优秀的 GitHub 源码.开发工具和动画特效,希望对 ...

  3. swift和OC中frame的小差异

    //1.0 OC中 CGRect .CGPoint.CGSize 的结构如下: struct CGRect { CGPoint origin; CGSize size; }; struct CGPoi ...

  4. swift开发新项目总结

    新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案   1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编      考虑到新项目 ...

  5. 窥探Swift系列博客说明及其Swift版本间更新

    Swift到目前为止仍在更新,每次更新都会推陈出新,一些Swift旧版本中的东西在新Swift中并不适用,而且新版本的Swift会添加新的功能.到目前为止,Swift为2.1版本.去年翻译的Swift ...

  6. iOS8.3发布了Swift 1.2带来哪些新变化

    苹果前几日在面向开发者推送iOS 8.3 Beta的同时,还发布了版本号为6D520o的Xcode 6.3 Beta,其中便包含了iOS 8.3 Beta和OS X v10.10 SDK,并进一步提升 ...

  7. Swift 04.Functions

    函数的基本构造 基本结构 func 函数名 (形参名:形参类型) ->返回值 {实现代码} 如果没有参数,那么也必须把参数的括号带上 如果有多个形参,那么必须以逗号 , 隔开 如果没有返回值,那 ...

  8. 开园第一篇 - 论移动开发环境 IOS与Android的差异

    首先,在真正写技术之前做个自我简介.本人08年开始学c语言 一年后,转vc++.开始接触MFC MFC做了两年.转眼11年了我考上了一个不知名的大专.搞C++发现没有市场了因为当时酷狗腾讯的软件已经日 ...

  9. Swift语法简介(二)闭包

    突然看到别人写的关于Block的帖子,让我突然有一种想写一篇关于闭包的帖子.在我的认知中,Swift中的闭包,就是Object-C中的Block--(或许我的认知太浅了).先上一个闭包的简单例子 le ...

随机推荐

  1. oricle数据库关于定时

  2. Libevent 的多线程操作

    起因是event_base 跨线程add/remove event 导致崩溃或者死循环. 据查:libvent 1.4.x是非线程安全的,要跨线程执行event_add,会有问题.因此传统做法是通过p ...

  3. HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integrated”

    网站发布到IIS上,访问时出现错误 原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装 解决:开始->所有程序->附件->右键点击“命令提 ...

  4. app进入后台之后接收到通知,点进去进入新的页面,再次进入后台,再点击通知进入页面(,两次通过通知进入的页面,创建了两次,会多一个页面,)解决办法监听

    在点击通知进入的页面的 //UIApplicationWillResignActiveNotification是app即将进入后台的方法 //增加监听使它在进入后台之前pop上一个页面 - (void ...

  5. <转> Lua使用心得(2)

    在lua脚本调用中,如果我们碰到一种不好的脚本,例如: do do end 那我们的程序主线程也会被阻塞住.那我们如何防止这种问题呢?下面就给出一个解决的办法. 首先为了不阻塞主线程,那我们就要开一个 ...

  6. 关于JS 沙箱(转)

    javascript中的沙箱并非传统意义上的沙箱,只是一种语法上的hack写法而已,javascript中处理模块依赖关系的闭包被称之为沙箱,和 ajax一样,这种sandbox coding风格是一 ...

  7. 初涉定制linux系统之——自动化安装Centos系统镜像制作

    最近碰到个需求:要在内网环境安装centos6.5系统并搭建服务,但由于自动部署脚本里安装依赖包使用的是yum安装,而服务器无法连接外网,实施人员也不会本地yum源搭建O__O "….. 本 ...

  8. new(C# 参考)

    在 C# 中,new 关键字可用作运算符.修饰符或约束. new 运算符 用于创建对象和调用构造函数. new 修饰符 用于隐藏基类中被继承的成员. new 约束 用于在泛型声明中约束可能用作类型参数 ...

  9. textField和textView限制输入条件

    以下两法方法都是实现textfield和textView的代理方法  需要先遵循代理 一:textField限制只能输入数字和小数点 且小数点后只能保留两位 小数点前最多5位 - (BOOL)text ...

  10. 4. Prototype(原型)

    意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性: 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或者 当 ...