1

我是 ObjC 的新手,正在编写一个简单的 CONSOLE 应用程序来从 web 获取数据并解析或做一些事情。我正在尝试使用 NSURLConnection 但在获取任何数据时遇到问题。我使用 TCPDUMP 来捕获流量,我看到请求甚至没有被发送出去,因此我什至没有在控制台中得到任何结果。我不是想在 mac 上创建一个简单的控制台应用程序,而是创建 ios 应用程序。任何帮助将不胜感激。** 我在这个项目中使用 Xcode v4.2 和 ARC。

主.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参数用于我的连接(例如,使用initWithRequest:delegate:startImmedately:to NSURLConnection。)也许尝试一下?如果没有,您可能需要显式调用start.

另外,我不确定这是否与您的问题有关,但您没有保留webData. (您正在使用自动释放指针对其进行初始化,该指针可以在任何 NSURLConnectionDelegate 回调之前释放。)

于 2012-07-01T06:28:34.820 回答