2014-02-26 27 views
1

我有一个类用于从我的服务器获取数据。从我的服务器返回的数据是JSON。出于某种原因,didReceiveData根本无法运行。我已经将NSLog放入它来测试它,但它没有做任何事情?为什么didReceiveData函数不能正常工作

这里是我的代码:

+(NSJSONSerialization *) getTask:(id)task_id{ 

    NSString *post = [NSString stringWithFormat:@"&task_id=%@", task_id]; 

    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://my-server.com/"]]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; 
    [request setHTTPBody:postData]; 

    NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 

    if(conn){ 
     NSLog(@"Testing"); 
    } 

    return json; 
} 

// Log the response for debugging 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data { 
    NSLog(@"test"); 
    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 
    json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 
} 

// Declare any connection errors 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog(@"Error: %@", error); 
} 

感谢,

彼得

+0

请注意,您*无法*从'getTask:'方法返回接收到的JSON,因为NSURLConnection *异步*工作。 - 也许你从'getTask:'返回后取消连接? –

+0

我不确定。那么我怎样才能把NSURLConnection放在一个类中呢? –

+0

因为上面的代码会在我的应用程序中多次使用,这就是为什么我将它放在类中 –

回答

3

getTask:是一个类的方法,这意味着self是类。因此委托方法也必须是类方法。

但请注意,您不能从getTask:方法返回收到的JSON,因为NSURLConnection异步工作。

+0

谢谢,这有其他方法的工作。现在我只需要知道如何返回最初调用该类的UIViewController的json变量。 –

+1

@PeterStuart:无法阻止当前线程,无法使异步方法同步。 - 通常的方法是'connectionDidFinishLoading'用接收到的数据回调视图控制器。还要注意''didReceiveData:'可能会被大量数据调用。 –

+0

我不确定你的意思?你有这方面的任何文件可以帮助吗? –

1

你需要开始连接。尝试使用initWithRequest:delegate:startImmediately:方法:

NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES]; 

,或者只是调用start方法:

if(conn){ 
    [conn start]; 
} 
+1

我认为这不能解释它。根据文档,'initWithRequest:delegate:'相当于调用'initWithRequest:delegate:startImmediately:'并将'YES'传递给'startImmediately'。 –

+0

我有这个代码在其他地方使用,它会自动启动它,但这是我第一次在类中使用它,这可能是为什么。我会回报。谢谢 –

+0

我试过这两种方法,没有什么作用? –

相关问题