C#与Swift异步操作的差异
作为一个从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异步操作的差异的更多相关文章
- Swift学习 (一)
以后会自己总结学习Swift的笔记与深化.希望能够帮助已经有Objective-C经验的开发者更快地学习Swift.我们一起学习,同时也品味到Swift的精妙之处. 结论放在开头:我认为Swift比O ...
- fir.im Weekly - 94 个 iOS 开发资源推荐
距离 2016 年还有 17 个日夜,而你和回家只隔了一张 12306 验证码的距离,祝大家抢票顺利.本期 fir.im Weekly 收集了一些优秀的 GitHub 源码.开发工具和动画特效,希望对 ...
- swift和OC中frame的小差异
//1.0 OC中 CGRect .CGPoint.CGSize 的结构如下: struct CGRect { CGPoint origin; CGSize size; }; struct CGPoi ...
- swift开发新项目总结
新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案 1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编 考虑到新项目 ...
- 窥探Swift系列博客说明及其Swift版本间更新
Swift到目前为止仍在更新,每次更新都会推陈出新,一些Swift旧版本中的东西在新Swift中并不适用,而且新版本的Swift会添加新的功能.到目前为止,Swift为2.1版本.去年翻译的Swift ...
- iOS8.3发布了Swift 1.2带来哪些新变化
苹果前几日在面向开发者推送iOS 8.3 Beta的同时,还发布了版本号为6D520o的Xcode 6.3 Beta,其中便包含了iOS 8.3 Beta和OS X v10.10 SDK,并进一步提升 ...
- Swift 04.Functions
函数的基本构造 基本结构 func 函数名 (形参名:形参类型) ->返回值 {实现代码} 如果没有参数,那么也必须把参数的括号带上 如果有多个形参,那么必须以逗号 , 隔开 如果没有返回值,那 ...
- 开园第一篇 - 论移动开发环境 IOS与Android的差异
首先,在真正写技术之前做个自我简介.本人08年开始学c语言 一年后,转vc++.开始接触MFC MFC做了两年.转眼11年了我考上了一个不知名的大专.搞C++发现没有市场了因为当时酷狗腾讯的软件已经日 ...
- Swift语法简介(二)闭包
突然看到别人写的关于Block的帖子,让我突然有一种想写一篇关于闭包的帖子.在我的认知中,Swift中的闭包,就是Object-C中的Block--(或许我的认知太浅了).先上一个闭包的简单例子 le ...
随机推荐
- ViewFlipper(翻转视图)的使用
android developers java.lang.Object --android.view.View ----android.view.ViewGroup ------android.wid ...
- [转载]Matlab之静态文本多行输出
转载文章,原文链接:Matlab中的静态文本框中显示多行内容 有时候,我们在GUI中利用静态文本框显示程序的结果,但是结果很长,一行未必可以显示的开,而静态文本框不像edit或listbox那样通过滚 ...
- PagedDataSource、Repeater以及AspNetPager在ASP.NET上分页。
一.前台使用服务器标签 1.1使用Repeater控件 <asp:Repeater ID="Repeater1" runat="server"> & ...
- Noip2016提高组 组合数问题problem
Day2 T1 题目大意 告诉你组合数公式,其中n!=1*2*3*4*5*...*n:意思是从n个物体取出m个物体的方案数 现给定n.m.k,问在所有i(1<=i<=n),所有j(1< ...
- 总结--解决 mysql 中文乱码
首先分析一下导致mysql 中文乱码的原因: 1.建表时使用了latin 编码 2.连接数据库的编码没有指定 3.写入时就已经乱码(这种情况需要自己检查源数据了) 解决方法总结: 1.创建库时指定编码 ...
- RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互
本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...
- python 整齐输出与编码读写
# -*- coding:utf-8 -*- # Author:mologa for x in range(1,11): print(repr(x).rjust(2),repr(x*x).rjust( ...
- UiAutomator自动化测试框架介绍
UiAutomator自动化测试框架介绍 环境搭建 1 必要条件 1.1 JDK 1.2 SDK(API高于15) 1.3 Eclipse 2 ...
- Centos | Linux 下安装启动 mysql 出现 8618 [ERROR] Aborting,查看日志:Plugin 'FEDERATED' is disabled.
1.试试启动时指定配置文件 ./bin/mysqld_safe --defaults-file=mysql.cnf 或 ./bin/mysqld_safe --defaults-file=mysql. ...
- python学习之路-day12-mysql && orm
一.数据库 1.数据库介绍 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储 ...