这个简单的代码(目标C)有什么问题?



我想下载一些网页,但此示例代码似乎不起作用。它打印"开始下载"然后退出,为什么委托方法不执行?示例代码中有什么问题?谢谢

main.m
#import <Foundation/Foundation.h>
#import "Test.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Test * test = [[Test alloc]init];
        [test downloadData];
    }
    [NSThread sleepForTimeInterval:21.0f];
    return 0;
}
Test.h

#import <Foundation/Foundation.h>
@interface Test : NSObject <NSURLConnectionDelegate,NSURLConnectionDataDelegate,NSURLConnectionDownloadDelegate>
@property (retain) NSMutableData * receivedData;
@property (retain) NSURLConnection * theConnection;
- (void) downloadData;
@end
Test.m
#import "Test.h"
@implementation Test
- (void) downloadData
{
    NSURLRequest *theRequest=
      [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sf.net/"]                                  
                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                   timeoutInterval:60.0];
    _receivedData = [NSMutableData dataWithCapacity: 0];

    [NSURLConnection sendSynchronousRequest:theRequest
                          returningResponse:nil
                                      error:nil];
    NSLog(@"begin download");
    if (!_theConnection) {
        _receivedData = nil;
        // Inform the user that the connection failed.
    }
}
enter code here
#pragma mark -
#pragma mark NSURLConnectionDataDelegateenter code here methods
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"1");
    [_receivedData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"2");
    [_receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error
{
    NSLog(@"3");
    _theConnection = nil;
    _receivedData = nil;

    // inform the user
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    NSLog(@"4");
    NSLog(@"Succeeded! Received %lu bytes of data",(unsigned long)[_receivedData length]);

    _theConnection = nil;
    _receivedData = nil;
}
-(void) connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL
{
    NSLog(@"5");
}
@end

有两种同步或异步的方法:

在同步中,未调用任何委托,右行为https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/occ/clm/NSURLConnection/sendSynchronousRequest:returningResponse:error:

_receivedData = [NSURLConnection sendSynchronousRequest:theRequest
                          returningResponse:nil
                                      error:nil];
    NSLog(@"begin download");
    if (!_theConnection) {
        _receivedData = nil;
        // Inform the user that the connection failed.
    }

在异步中,您需要使用 – initWithRequest:delegate:https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/occ/instm/NSURLConnection/initWithRequest:delegate:

[NSURLConnection alloc] initWithRequest:delegate:theRequest
                          delegate:self];
NSLog(@"begin download");

最新更新