1

私は ObjC が初めてで、単純な CONSOLE アプリを作成して、Web からデータを取得して解析したり、何かを行ったりしていました。NSURLConnection を使用しようとしていますが、データの取得に問題があります。TCPDUMP を使用してトラフィックをキャプチャしましたが、リクエストが送信されていないため、コンソールに結果が返されません。私はiOSアプリをMac上の単純なコンソールアプリとして作成しようとしているのではありません。どんな助けでも大歓迎です。** このプロジェクトでは Xcode v4.2 と ARC を使用しています。

main.m:

#import <Foundation/Foundation.h>
#import "HTTPRequest.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {  
    HTTPRequest *http = [[HTTPRequest alloc]init];
    [http doMagic ];
    }
  return 0;
}

HTTPRequest.h:

 #import <Foundation/Foundation.h>
    @interface HTTPRequest :NSObject <NSURLConnectionDelegate> {
       NSMutableData *webData;
       NSURLConnection *conn;
    }

    -(void) doMagic;

    @end

HTTPRequest.m:

#import "HTTPRequest.h"
@implementation HTTPRequest
-(void) doMagic {
    NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
    conn = [[NSURLConnection alloc] initWithRequest:req
                                           delegate:self];
    if (conn) {
        webData = [NSMutableData data];
        NSLog(@"DEBUG:  %@", [webData length]);
        }

    }

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

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

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

    NSLog(@"Succeeded! Received %lu bytes of data",[webData length]);

    NSLog(@"DONE.  Received Bytes: %lu", [webData length]);
    NSString *theData = [[NSString alloc] initWithBytes:[webData mutableBytes] 
                                                length:[webData length] 
                                              encoding:NSUTF8StringEncoding];
    // -prints html received --
    NSLog(@"%@", theData);
    }
    @end
4

2 に答える 2

1

ありがとうOMZ。NSRunLoop が答えでした。ここで素晴らしい記事を見つけました: http://coc24hours.blogspot.com/2012/01/using-nsrunloop-and-nsurlconnection.html

そして修正のために:

これをテスト用に追加しただけで、if ステートメント内で問題なく動作しました。

  if (conn) {
        webData = [NSMutableData data];
        NSRunLoop *loop = [NSRunLoop currentRunLoop];
        [loop run]; 
        NSLog(@"DEBUG:  %@", [webData length]);
    }

みんなの助けに感謝します。

于 2012-07-02T03:40:28.990 に答える
0

私は通常startImmediately、接続にパラメーターを使用します( to を使用する場合のinitWithRequest:delegate:startImmedately:ようにNSURLConnection)。それで試してみてください。そうでない場合は、おそらく明示的に呼び出す必要がありますstart

また、これがあなたの問題に関連しているかどうかはわかりませんが、webData. (NSURLConnectionDelegate コールバックの前に解放できる自動解放ポインターで初期化しています。)

于 2012-07-01T06:28:34.820 に答える