ylc*_*ylc 9 objective-c ios nsurlsession
我最近一直在学习Objective C,我决定尝试连接.
NSURLConnection的一切都很棒,直到我发现它已经过时,并尝试使用NSURLSession.
我正在尝试一个非常简单的示例,但似乎无法让我的应用程序在完成块中运行代码.
这是使用的代码:
NSURL * url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?q=London,uk"];
NSLog(@"2");
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSLog(@"3");
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject
delegate: nil
delegateQueue: [NSOperationQueue mainQueue]];
NSLog(@"4");
NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"11");
if(error == nil)
{
NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"Data = %@",text);
}
NSLog(@"22");
});
}];
NSLog(@"5");
[dataTask resume];
NSLog(@"6");
Run Code Online (Sandbox Code Playgroud)
我从主执行中获取了所有数字,但是从未执行completionHandler.我也尝试使用代表,但没有成功.
提前致谢.
编辑 按照建议,我已将我的功能更改为以下内容:
-(void) doGET{
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject];
NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:[self url]
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"11");
if(error == nil)
{
NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"Data = %@",text);
}
NSLog(@"22");
}];
[dataTask resume];
}
Run Code Online (Sandbox Code Playgroud)
我的完成经理仍然没有运行.我也尝试使用sharedSession而不是传递配置,但也没有运气.
谢谢您的帮助
如果你要使用数据任务的完成移交块,而不是指定delegate的nil,就像这样:
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject
delegate: nil
delegateQueue: [NSOperationQueue mainQueue]];
Run Code Online (Sandbox Code Playgroud)
您应该使用完全不采用的方法实例化您的会话delegate:
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject];
Run Code Online (Sandbox Code Playgroud)
或者,假设您根本没有自定义配置,则可以跳过NSURLSessionConfiguration完全实例化并使用共享NSURLSession:
NSURLSession *defaultSession = [NSURLSession sharedSession];
Run Code Online (Sandbox Code Playgroud)
但是,最重要的是,sessionWithConfiguration:delegate:queue:除非您要实现委托,否则不应该使用再现,在这种情况下,您不会使用参数的NSURLSessionDataTask方法再现completionHandler.
此外,请确保您的设备/模拟器运行的是iOS 7.0或更高版本.
| 归档时间: |
|
| 查看次数: |
17778 次 |
| 最近记录: |