这是我参与「第四届青训营 」笔记创作活动的第13天
是日,一个菜鸡程序猿正在为了一个网络请求而抓耳挠腮,实际上,他已经无能狂怒了一个下午了。忽然,一道闪电划过———心机之蛙一直摸你肚子(柯南表示走错场了)——菜鸡程序猿突然领悟了一切!他想起了以前曾经看到过的一个概念,并且低声笑道:“原来...,原来这就是回调产生的原因吗。哈哈,我悟啦!”
这一切还要从菜鸡程序猿开发一个简化版天气预报app说起。要想实现app的功能,首先要获取相应的天气数据。而这,就需要发送网络请求从在线的免费API获取。然后在这之前还有一步要做,那就是把要搜索的城市对应的location id查到。而这,依然需要发送网络请求从在线的免费API获取。
只见这个菜鸡程序猿在敲了一阵子代码后并且测试输出后,终于确定获取location id的函数成功实现了后,试图将这个函数返回的(NSString *)locationID值传给获取天气数据的函数。然而当他初次运行时,只见直接报错,稍加分析后发现返回的json数据是空。于是这个菜鸡程序猿显示补上了空json处理,然后加了几行NSLog调试,想看看是哪里出了问题。查了几次后,终于确定,是返回的locationID是nil。这不对啊,他想,于是又在获取location id的函数的网络请求语块的success部分加了NSLog(@"%@",locationID);结果发现,终端先是输出了判断函数getLocationID返回值是否为空的语句locationID = nil(真的为空),然后又输出了locationID等于某个正确的id码。他恍然大悟,这个网络请求是异步执行的,在得到网络返回结果前函数就return了。
菜鸡程序猿开始苦死冥想,“我在return前先让它等个几秒这样数据肯定请求回来了”,这是他想到的第一个办法。结果失败了。于是他尝试在getLocationID函数调用后再等几秒,结果模拟器界面直接卡死了。“哦,主线程卡死了吗,那我看来得开辟一个子线程等待”,他想。于是他用生疏的手法写着几乎没写过的多线程语法,但怎么尝试都以失败告终。
多次的失败让菜鸡程序猿又苦恼又愤怒。就这样,他无能狂怒了一个下午。一道闪电划过———心机之蛙一直摸你肚子(梅开二度)——菜鸡程序猿突然领悟了一切!他想起了以前曾经看到过的一个概念,并且低声笑道:“原来...,原来这就是回调产生的原因吗。哈哈,我悟啦!”于是他很快把getLocationID的返回值改为void,并加了一个名为callback的block参数,在success语块内调用了这个callback block。他终于成功请求到了天气数据,而他对异步和回调也有了更深刻的理解......