网络请求数据(以新浪微博为例)
1.把字符串网址首先进行转码,然后再转换成url
使用字符串的类方法stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]进行转码,使用URLWithString类方法,把字符串封装成NSURL类型的,这样就可以获得向网络请求的地址
同步Get的操作:
2.使用NSURLConnection类中的sendSynchronousRequest类方法来获取JSON数据的信息,用NSData类型来接收(存储的数据格式为JSON格式的),使用的Request的类型是NSURLRequest,还有下面的异步Get也是一样的
3.使用NSJSONSerialization类中的类方法JSONObjectWithData把JSON格式的数据进行解析成字典,因为JSON数据初始就是一个字典来的,所以用字典来接收,这样,就可以获取一个字典,接下来就是对字典进行操作
4.定义属性来接收该字典中的数据,但是注意的是,定义的属性一定是与获取的JSON数据中的格式和名称一样的,而且属性要写全,这样也许才不会造成获取数据失败吧。利用属性来接收字典中的值,进行操作。想要获取什么信息,就是对该字典取key进行获取value,使用objectForKey来进行取该key的值(该步骤是通过属性来对获取到的字典数据进行操作,因此无论是同步或者异步都必须的)。在使用model类来对数据处理时,就直接调用setValuesForKeysWithDictionary来对传进来的字典进行处理即可
异步Get的操作:
使用代理的方式:
2.首先要实现NSURLConnectionDataDelegate这个协议
3.使用NSURLConnection类中的connectionWithRequest类方法进行绑定代理人
4.实现代理获取的数据的三个协议方法:
该方法是告诉服务器,准备向客户发送数据,一般在此方法中初始化接收该数据的对象
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
该方法是从服务器接收数据(因为在网络中数据会被分段接收的,因此该方法就可执行多次),一般在此方法中进行数据的拼接,因为网络中的数据是分段的
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
该方法是告诉服务器接收数据完成,在该方法完成,就是进行JSON数据的解析,一般在此进行数据的读取,就是把其转换成一般人员都能读懂的数据
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
解析数据的步骤与同步时是一样的,同时使用实例方法performSelectorOnMainThread进行对数据的输出操作
注:由于以上的方法都需要获取的数据对象,因此要将其定义为全局变量
使用block方式:
2.使用NSURLConnection类的+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse* __nullable response, NSData* __nullable data, NSError* __nullable connectionError))的方法进行对JSON数据的获取
3.使用dispatch_async(dispatch_queue_t queue, dispatch_block_t block)该方法进行把字典数据在主线程中显示
更新UI最好在主线程中更新,原因如下
1.在子线程中是不能进行UI更新的,而可以更新的结果只是一个幻想:因为子线程代码执行完毕,又自动进行主线程,执行了主线程中的UI更新的函数栈,这中间的时间非常短,就让大家误以为子线程可以更新UI,如果子线程一直在运行,则子线程中的UI更新函数栈,主线程无法获知,即无法更新
2.只有极少数的UI能,因为开辟吸纳成时会获取当前环境,如点击某个按钮,这个按钮响应的方式是开辟一个子线程,在子线程中对该按钮进行UI更新是能及时的,如换标题,换背景图,但是这没有任何意义
同步Post操作:
2.使用NSMutableURLRequest类中的方法requestWithURL来请求数据
3.设置方法体,设置NSMutableURLRequest类中的实例方法setHTTPMethod的参数为”POST”,设置setHTTPBody的方法,该方法的参数需要是微博的请求参数代码,该方法参数类型却是NSData类型的,因此要进行转码,使用NSString的实例方法dataUsingEncoding进行把字符串转为NSData类型的
4.使用NSURLConnection类中的类方法sendSynchronousRequest把信息发送到服务器中
异步Post操作:
2.与同步Post一样的
3.与同步Post一样的
4.使用代理的方式来进行异步操作。使用NSURLConnection类中的类方法connectionWithRequest进行操作,与异步Get的代理是同一个协议和方法体,因此也是同步Get的三个方法。在最后的传送数据完成时,可不进行操作,因为只需要的是把数据发送即可