2013-02-11 46 views
0

我有一个应用程序,我用我的JSON数据与dataWithContentsOfURL
但是因为我需要把它变成异步时尚。
现在我用NSURLConnection来处理这个问题,我没有收到任何有用的数据,所有我得到的是didReceiveResponse方法中的状态码200,但从未调用didReceiveData。 并在connectionDidFinishDownloadingdestinationURL返回nullNSURLConnection不返回数据,其中dataWithContentsOfURL

我不知道笏这个问题,我真的很感谢一些帮助。

委托

#import "NetWorkToGuiDelegate.h" 

@implementation NetWorkToGuiDelegate 
@synthesize data; 
@synthesize caller; 

- (id) init: (SEL) pointer :(NSObject *) c; 
{ 
    doWhenDone = pointer; 
    self.caller = c; 
    data = [[NSMutableData alloc]init]; 
    return self; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]; 

    NSLog(@"%@",responseText); 

} 

- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL 
{ 
    NSLog(@"post download finished"); 
    data = [NSData dataWithContentsOfURL:destinationURL]; 
    NSLog(@"data: %@",data); 
    NSLog(@"URLconnection %@", connection.currentRequest); 

    #pragma clang diagnostic push 
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
    [caller performSelector:doWhenDone withObject:data]; 
    #pragma clang diagnostic pop 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [self.data setLength:0]; 
    NSHTTPURLResponse *resp= (NSHTTPURLResponsae *) response; 
    NSLog(@"got responce with status %d",[resp statusCode]); 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d 
{ 
    NSLog(@"data recieved %@",d); 
    [self.data appendData:d]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"") 
           message:[error localizedDescription] 
           delegate:nil 
         cancelButtonTitle:NSLocalizedString(@"OK", @"") 
         otherButtonTitles:nil] show]; 
    NSLog(@"failed"); 
} 

// Handle basic authentication challenge if needed 
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    NSString *username = @"username"; 
    NSString *password = @"password"; 

    NSURLCredential *credential = [NSURLCredential credentialWithUser:username 
                  password:password 
                  persistence:NSURLCredentialPersistenceForSession]; 
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
} 

@end 

通话

NetWorkToGuiDelegate *nwgd = [[NetWorkToGuiDelegate alloc] init:@selector(login:) :self]; 
    NSString *stringURL = [NSString stringWithFormat:@"%@%@%@%@", dk.baseURL, @"menu?code=",dk.loginCode,@"&v=1"]; 
    NSURL *url = [NSURL URLWithString:stringURL]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:nwgd]; 
    [urlConnection start]; 

我只补充一点,调用发生在主线程

回答

0

其实有很多点,使答案这个问题有这么多questions on SO本身

去th粗略这个漂亮的post

而且一定要读doc从苹果本身。(包含代码样本和说明)

希望这将解决这些问题为您服务。

编辑

-(void)startAConnection 
{ 
    // Create the request. 
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"] 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 
    // create the connection with the request 
    // and start loading the data 
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
    if (theConnection) { 
     // Create the NSMutableData to hold the received data. 
     // receivedData is an instance variable declared elsewhere. 
     receivedData = [NSMutableData data]; 
    } else { 
     // Inform the user that the connection failed. 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    // This method is called when the server has determined that it 
    // has enough information to create the NSURLResponse. 

    // It can be called multiple times, for example in the case of a 
    // redirect, so each time we reset the data. 

    // receivedData is an instance variable declared elsewhere. 
    [receivedData setLength:0]; 
} 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // Append the new data to receivedData. 
    // receivedData is an instance variable declared elsewhere. 
    [receivedData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection 
    didFailWithError:(NSError *)error 
{ 
    // inform the user 
    NSLog(@"Connection failed! Error - %@ %@", 
      [error localizedDescription], 
      [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
} 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]); 

} 

呼叫startAConnection启动进程

注意:不要忘记<NSURLConnectionDelegate>在.H

编码快乐:)

+0

我读过都和更多的线程我只是不知道有什么不同。我的问题仍然是,它似乎不工作。被调用的链接是https://portal.apprenticexm.nl/appapi/menu?code=123456&v=1,并且清楚地包含数据。 – 2013-02-11 17:05:12