• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#与Swift异步操作的差异

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  作为一个从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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
swift中的协议发布时间:2022-07-13
下一篇:
Swift-关键字(typealias、associatedtype)发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap