- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个注册 View Controller ,它处理所有用户输入并调用传递给它的另一个类 (wsClass) 中的函数,该数据作为 NSDictionary。
调用 wsClass 中的函数并建立连接并从服务器返回数据并在 session 中可用。
我的问题是如何将该数据返回到最初调用该函数的注册 View Controller ,它总是空的。
这是registrationViewController中的调用:
wsClass *ws = [[wsClass alloc] init];
NSDictionary *testDict = [[NSDictionary alloc] initWithObjectsAndKeys:username.text,@"username",email.text,@"email",password.text,@"password", nil];
NSDictionary *respDict = [ws sendData:testDict];
这是在 wsClass.m 中调用的函数:
- (NSDictionary *)sendData:(NSDictionary *)sendDict {
NSMutableString *sendStr = [[NSMutableString alloc] init];
[sendDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[sendStr appendFormat:@"&%@=%@", key, obj];
}];
NSLog(@"sendStr is: %@",sendStr);
NSString *noteDataString = [NSString stringWithFormat:@"%@%@",REQUIRED,sendStr];
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlTest]];
request.HTTPBody = [noteDataString dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPMethod = @"POST";
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// The server answers with an error because it doesn't receive the params
// handle response
if(error == nil)
{
[getReqAlert dismissWithClickedButtonIndex:0 animated:YES];
NSError *e = nil;
jsonArray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableLeaves error: &e];
if (!jsonArray) {
NSLog(@"Error parsing JSON: %@", e);
} else {
NSLog(@"resp: %@ = %@",[jsonArray objectForKey:@"status"],[jsonArray objectForKey:@"msg"]);
NSLog(@"Dictionary count: %lu", jsonArray.count);
}
}
}];
[postDataTask resume];
return jsonArray;
最佳答案
帖子异步完成,因此您的 wsClass
需要在帖子完成后告知调用者有关完成的信息。一个很好的方法是用调用者提供的应该在完成时运行的代码块来扩充 sendData
方法:
将 sendData:
更改为如下所示:
// it doesn't return anything, because all it does is launch the post
// but when the post is done, it invokes completion
- (void)sendData:(NSDictionary *)sendDict completion:(void (^)(NSDictionary *))completion {
// the stuff you're already doing
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// the stuff you're already doing
// now tell the caller that you're done
completion(jsonArray);
}];
}
调用者现在看起来像这样:
// change the UI to say "I'm busy doing the post"
[ws sendData:testDict completion:^(NSDictionary *responseDict) {
NSLog(@"this runs later, after the post completes %@", responseDict);
// change the UI to say "The post is done"
}];
关于此的几点注意事项:(1) 我没有向 block 中添加错误参数,您可能应该这样做。检查并使用 nil 和错误调用该 block ,或者使用 json 输出和 error=nil。 (2) 您的代码假定 json 结果解析为字典。在代码中假定它之前,请确保它始终为真。 (3) 类名通常以大写开头。
关于ios - 如何获取数据从 NSURLSessionDataTask 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20871506/
我有一个使用 NSURLSessionDataTask 调用 API 的函数,您可以在此处查看它: - (void)getExplorerUrl:(void (^)(NSString *))measu
我正在尝试向服务器发出请求,该请求应该返回我可以在应用程序的其余部分中使用的数据。这是我的代码: func makeNewUser() -> NSDictionary { var full_u
我正在使用 AFNetworking 并且我正在覆盖 -dataTaskWithRequest:completionHandler: 以基本上 MITM 我的请求并在调用实际响应 block 之前进行
我使用 NSURLSessionDataTask 获取 JSON 提要,并填充位于共享存储(单例)内的 NSMutableArray。外部世界可以通过将其转换为 NSArray 的 getter 来访
我不知道如何同步 NSURLSessionDataTask。 如何在 syncInfo1Info2 中同步这两个 session : - (void) syncInfo1Info2 { //How
我想知道 NSURLSessionDataTask 在后台的行为。 NSURLSessionDataTask 是否会立即暂停(一旦应用程序进入后台)?还是 iOS 会给出一些时间(希望有 30 秒左右
我正在创建一个 NSMutableRequest: self.req = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequ
当我开始使用 NSURLSessionDataTask 下载文件时,有一段时间进度不工作。然后在完成下载后只显示全蓝色的进度条。 我的代码 - (void)URLSession:(NSURLSess
我对 Objective C 和 iOS 开发总体来说是新手。我正在尝试创建一个应用程序,它会发出 http 请求并在标签上显示内容。 当我开始测试时,我注意到标签是空白的,尽管我的日志显示我已经恢复
我正在学习有关访问 API 和解析结果的教程。我正在逐字逐句地学习教程,但由于“预期返回‘NSURLSessionDataTask’的函数中缺少返回值”,我无法运行该程序 所以我将返回语句更改为“re
我要使用 NSURLSessionDataTask 执行请求链。当第一个请求完成时,我需要使用第一个请求中的 responseData 来执行另一个多重请求。最后,我得到 NSArray 并提供给 T
我正在尝试从将同时运行的多个 NSURLSessionDataTasks 中聚合数据。 __block NSMutableDictionary *languageDetails = [NSMutabl
我刚刚用 Swift 开发了一个库,用于将数据发布到特定服务器。我使用 NSURLSession.sharedSession().dataTaskWithRequest(request) 打开连接。现
我有一个 iOS 应用程序,它使用 NSOperationQueue、NSOperations 和 AFNetworking 2.1.0 来触发对服务器的请求。 -[NSOperation main]
我知道我可以使用 dataTaskWithURL:completionHandler: 获取 completionHandler block 中的数据,但这会阻止触发委托(delegate)方法,我需
场景: 作为用户,我可以拍摄(无限量)存储在应用程序文档文件夹中的照片和视频。这些媒体文件中的每一个都会在 Sqlite 数据库中获得一条记录,其中包含附加信息(例如标题)。所有这些都可以完全离线完成
在使用 NSURLSessionDataTask 向服务器发送 JSON 请求时,我遇到了一个非常奇怪的问题。 第一个请求通过并且我收到正确的 JSON 响应,当我执行第二个请求时,我总是得到旧的响应
我想确定来自 NSURLSessionDataTask 的响应是来自缓存,还是来自服务器 我正在从 创建我的 NSURLSessionDataTask request.cachePolicy = NS
我有一个注册 View Controller ,它处理所有用户输入并调用传递给它的另一个类 (wsClass) 中的函数,该数据作为 NSDictionary。 调用 wsClass 中的函数并建立连
我从 Web 获取 JSON 数据,对其进行解析,然后使用它在 map 上显示图钉。 这里是方法一,没有问题: NSString *CLIENT_ID = @"SECRET_ID"; NSSt
我是一名优秀的程序员,十分优秀!