iphone - Objective C - 异步http请求阻塞程序

标签 iphone objective-c multithreading asynchronous asihttprequest

我在异步 http 请求方面遇到了一个非常奇怪的问题:

我向服务器发送一个请求,服务器延迟 10 秒,然后发送响应。

为了不阻塞程序,我是异步进行的。 如果我只是调用该方法(通过 NSThread) - 它不起作用。我认为这是因为线程在完成之前就终止了(服务器等待 10 秒)。 如果我调用该方法并使用 CFRunLoopRun() - 它实际上可以工作,但是整个程序会停止工作 10 秒。 我的问题是如何使线程存活足够的时间并且仍然不阻止程序运行。 当然,有一个选项是我的代码中有一些错误导致了这一切,所以我发布了它的所有相关部分。

这是主线程:

self.MessagesList=[[MessagesArray alloc] init];
[NSThread detachNewThreadSelector:@selector(backgroundMethod) toTarget:self withObject:nil];

-(void)backgroundMethod
{       
    [self.MessagesList updateFromServer];  
      CFRunLoopRun();        //the method dies without this line  
}

这是请求:

-(void)updateFromServer{
    NSLog(@"method called");
    responseData = [NSMutableData data];
    NSURLRequest *request =
    [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8000/messages/views/new_messages/"]];
    NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request     delegate:self];
    if(!connection) {
        NSLog(@"connection failed :(");
    } else {
        NSLog(@"connection succeeded  :)"); 
    }
}

而responseData定义如下:

@property (nonatomic,strong) NSMutableData *responseData;

我还尝试了performSelectorInBackground而不是NSThread,甚至在没有任何它们的情况下调用updateFromServer,结果是相同的。

我正在与 ARC 合作 - 也许这与此有关?

我真的必须解决这个问题,但不知道如何解决,所以如果你能帮助我,我会很高兴。

谢谢

最佳答案

无需对异步请求使用任何线程。只需确保您拥有一个具有所有必需委托(delegate)方法的委托(delegate)即可。

调用runloop是危险的——如果你在这里提出问题而不是回答,不要调用CFRunLoopRun()。

我没有看到任何实际启动连接的代码 - 您的代码不会发生任何事情。它永远不会开始向服务器发送任何内容或从服务器接收任何内容。

ARC与此无关。 ARC 并不是神秘地阻止 http 连接工作的东西。

关于iphone - Objective C - 异步http请求阻塞程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8643406/

相关文章:

iphone - 如何仅隐藏/禁用第一个 uinavigationbar?

objective-c - NSSlider NSSliderCell 裁剪自定义旋钮

ios - UIAlertView 的大小

python - 使用 python 和 matplotlib 同时获取数据和更新图形

python - 为什么要使用 tensorflow gfile? (对于文件 I/O)

c# - 如何使用户控件在自己的线程上运行

iphone - 如何判断请求何时完成(ASIHTTPRequest)?

iphone - ios 6 Storyboard和基于方向的自定义布局

ios - 在tableview中搜索过滤后,为什么它显示空白单元格?

ios - 将 .swift 文件导入 Objective-C 文件会导致方法声明错误缺少上下文