【问题标题】:NSURLConnection Delegates IssueNSURLConnection 代表问题
【发布时间】:2014-08-11 14:55:49
【问题描述】:

我对 NSURLConnection 委托有疑问。只是我需要根据该结果从服务器获取结果,我会做一些事情。 问题是:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

方法终于调用了,我在这部分收到了答案。然后我不能使用来自服务器的结果。

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"DidfinishLaunch started");
    self.json = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil];

    if (!self.parsedJsonContent) {
        self.parsedJsonContent = [[NSMutableArray alloc]init];
    }

    for (int i=0; i<self.json.count; i++) {
    NSString *result = [self.json objectAtIndex:i];
    self.user.result = result;}
    }
}

当我想在 MainViewController 中使用 result 的值时:

NSLog(@"result: %@",[self.jsonProcess GetJsonResultForLogin]);

它是空的。那么我要如何获取 result 的值,因为 result 的值是在最后调用的方法 connectionDidFinishLoading 中填写的。

【问题讨论】:

  • 您在 didReceiveData 中构建 responseData 的方式存在问题,或者您从服务器收到的响应不是有效的 JSON。如果 JSON 转换返回 nilNSLog(@"responseData: %@", [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding]); 并查看 responseData 包含的内容。
  • 调试 101:将问题分解为基本语句。调试或记录值。检查。在这种情况下 NSLog("responseData: %@", self.responseData); 并检查您从服务器返回的内容。
  • 结果没有问题,它是作为“记录存在”来的,但是最后执行了didFinishLoading方法,同时mainViewcontroller类中的所有其他方法都完成了。那么我将如何将结果发送回 mainViewControllar 类并做我想做的事。
  • [self.jsonProcess GetJsonResultForLogin] 在做什么?是在启动下载吗?
  • @AhmetNM 如果您担心didReceiveData 异步完成这一事实,您可以将代码放入connectionDidFinishLoading 中以启动视图控制器的更新(例如,如果它是一个表格视图控制器,请致电[self.tableView reloadData])。

标签: objective-c delegates nsurlconnection


【解决方案1】:

也许你需要抓取接收到的数据:

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

并且只需使用

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

知道连接何时结束。

【讨论】:

  • 问题是:首先我从服务器检查记录是否存在。 1.我从服务器2请求。然后我想看看结果,我打印出来了。 3. 然后执行所有代表。在这种情况下,我怎样才能捕捉到结果的价值。结果出来时,编译器已经执行了我的 NSLog(@"result: %@",[self.jsonProcess GetJsonResultForLogin]);线...
  • 我不明白为什么 2 和 3 是不同的阶段。要查看任何结果,必须调用委托方法。您是否使用 MainViewController 作为 NSURLConnection 的委托?
【解决方案2】:

SPJsonProcess.m

-(void)OpenAConnection:(NSString *)URL appendStringURL:(NSString *)appendURL
{

   NSMutableString *postUrl = [NSMutableString stringWithString:URL];

if (![appendURL isEqualToString:nil]) {
        [postUrl appendString:appendURL];
    }

NSURL *jsonUrl = [NSURL URLWithString:postUrl];

   NSData *data = [NSData dataWithContentsOfURL:jsonUrl];

   self.responseData = [NSMutableData data];

   NSURLRequest *request = [NSURLRequest requestWithURL:jsonUrl];

   connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];

   [connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

   [connection start];


-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    NSLog(@"DidfinishLaunch started");

    self.json = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil];

   if (!self.parsedJsonContent) {

       self.parsedJsonContent = [[NSMutableArray alloc]init];
    }

for (int i=0;i < self.json.count; i++) {

NSString *result = [self.json objectAtIndex:i];

self.user.result = result;
}
}

-(NSString *)GetJsonResultForLogin
{

   return self.user.result;
}

登录视图控制器

>-(void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id<FBGraphUser>)user
{
>[self.jsonProcess OpenAConnection:@"My Domain adress" appendStringURL:appendString];

>NSLog(@"Method invoked");


>NSLog(@"result: %@",[self.jsonProcess GetJsonResultForLogin]);

导致日志为空。但是在 didFinishLoading 方法中从服务器获取结果没有问题。

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多