您好我正在尝试创建一个NSOperaion队列来下载一堆PDF文件。但它不起作用。委托方法不会被调用NSURLConnection,因为我把它们放在NSOperation队列中......任何替代方案或解决方案???
- (void) loadData {
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation;
for(int i=0;i<[self.pdfArray count];i++){
NSString *url = [NSString stringWithFormat:@"http://www.somelink.com/%@.pdf",[self.pdfArray objectAtIndex:i]];
operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(loadDataWithOperation:)
object:url];
[queue addOperation:operation];
[operation release];
}
}
- (void) loadDataWithOperation:(NSString *) url{
// Create the request.
NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
NSURLConnection *theDownload = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];
}
答案 0 :(得分:3)
看看这里,这是一个对我有帮助的教程,所以我给它添加了书签
http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/
答案 1 :(得分:1)
我无法真正看到代码存在问题,但它可能是一个线程问题。 NSOperationQueue通过Grand Central Dispatch创建一个线程来运行该操作。如果NSURLConnection然后也试图创建一个线程,它可能会导致一个问题 - 我不确定一个线程可以是一个子线程的子节点。
您可以执行sendSynchronousRequest:以便它保留在您在NSOperationQueue中创建的线程中,看看它是否更好。
答案 2 :(得分:0)
NSURLConnection需要运行NSRunLoop才能运行。如果在NSRunLoop未运行的线程上调用NSURLConnection方法,则NSURLConnection将永远不会运行。 NSOperationQueue创建的工作线程没有运行NSRunLoops。当NSURLConnection收到服务器的响应时,你也不能保证线程仍然存在。
可以从后台线程调用NSURLConnection方法,但它必须是一个可以保证其生命周期的线程,并且需要运行NSRunLoop。