首页 > 试题广场 >

以下代码欲在NSOperation子线程中异步请求网络数据,

[不定项选择题]
以下代码欲在NSOperation子线程中异步请求网络数据,请在注释处写上一段代码以满足要求。finished_代表异步请求结束的标志变量。 请选出有作用的选项:【多选】()
-(void)start {
    if (![self isCancelled]) {
        connection_ = [[NSURLConnection alloc]initWithRequest:
                       [NSURLRequest requestWithURL:download_url

                        cachePolicy:NSURLRequestReloadlgnoringLocalCacheData
                        timeoutlnterval:15]delegate:self];
        if (connection_ != nil) {
            executing_ = YES;
        } else {
            finished_ = YES;
        }
        while (!finished_) {
            //代码加入处
        }
    }
    else {
          finished_ = YES;
    }
  }

  • [[NSRunLoop		currentRunLoop]  runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
  • [[NSRunLoop		currentRunLoop]  runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithinterval:0.1]];
  • [[NSThread currentThread]waitForTimeinterval:0.1];
  • [NSThread sleepForTimeinterval:0.1];
答案:A

只有主线程的NSRunLoop会默认启动,自己新起的线程,要自己手动调用RunLoop。
这里新起了一个线程,调用NSURLConnection的异步方法,如果不设置RunLoop,则NSURLConnection的delegate函数不会被运行,因为线程已经结束。在NSURLConnection的delegate方法中去设置finished_变量为YES,线程才会退出while循环而结束。

现实中,一般没人这么写代码,如果NSURLConnection要放到队列中执行,一般会自己生成一个NSOperationQueue,然后调用NSURLConnection的setDelegateQueue方法。一般批量下载会用到。
发表于 2015-04-04 19:47:50 回复(0)
A ,当前请求没有完成,利用runloop阻塞线程让他继续完成请求
发表于 2015-03-24 22:03:30 回复(0)