2

私は iOS 開発にかなり慣れていないので、URL からコンテンツを取得しようとしています。NSURLConnection を使用するための Apple チュートリアルを使用しています。すべてが機能していますが、データを取得していません。私は周りを見回しましたが、私の問題に対する答えが見つかりませんでした。プロジェクトで ARC も使用していますが、それが問題の原因でしょうか?

ヘッダーファイルから始まる、使用しているコードは次のとおりです。

@interface ViewController : UIViewController
@property (nonatomic, retain) NSMutableData *receivedData;
@end

実装ファイル:

@implementation ViewController

@synthesize receivedData;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"1. viewDidLoad");
    // Create the request
    NSURLRequest *request = [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 *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if (connection) {
        NSLog(@"2. connection succeeded");
        receivedData = [NSMutableData data];
    } else {
        NSLog(@"2. connection failed");
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse     *)response
{
    NSLog(@"3. didReceiveResponse");
    [receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"4. Connection failed! Error - %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"4. Succeeded! Received %d bytes of data", [receivedData length]);
}

すべての NSLog が機能していますが、receivedData のバイト数が 0 であると言い続けています。私の問題に対する答えが見つからなかったので、この質問で答えを見つけられることを願っています。

4

3 に答える 3

0

URL Loading System Programming GuideのUsing NSURLConnection部分を ARCを使用して翻訳しました。

//
//  MyConnection.h
//

#import <Foundation/Foundation.h>

@interface MyConnection : NSObject

- (void)start;

@property NSMutableData *receivedData;

@end


//
//  MyConnection.m
//

#import "MyConnection.h"

@implementation MyConnection

- (void)start {

    // 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 fold the received data
        // ReceivedData is an instance variable declared elsewhere
        _receivedData = [NSMutableData data];

    }
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [_receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [_receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    // Inform the user
    NSLog(@"Connectionfailed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // Do something with the data
    NSLog(@"Succeeded! Recevied %d bytes of data", [_receivedData length]);

}

@end
于 2013-06-04T09:33:21.420 に答える
0

完成のためだけに。threadingの原因で、同じ問題が発生しました。オブジェクトを所有するスレッドが を所有するNSURLConnectionスレッドと異なる場合、 はdelegate通知delegateを受け取りません。つまり、接続エラーもなくなるということです。

したがってNSURLConnection、デリゲートを作成したのと同じスレッドで作成するようにしてください。

于 2013-07-31T14:21:12.537 に答える