Tag: nsoperation

iOS – NSOperation内的asynchronousNSURLConnection

我知道这个问题在这个问题上被问了很多次,但是我没有设法使它在我的项目中工作。 所以,我想要NSOperation子类,并使用NSURLConnection下载文件。 什么是正确的方法来做到这一点? 这是我的代码不起作用:首先,我将所有的操作添加到循环中: DownloadFileOperation *operation; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; for (int i=0; i<10; i++) { operation = [[DownloadFileOperation alloc] init]; operation.urlString = pdfUrlString; [queue addOperation:operation]; operation = nil; } 这是我的子类: @interface DownloadHandbookOperation : NSOperation <NSURLConnectionDelegate> { } @property (strong, nonatomic) NSString *urlString; @end @implementation DownloadHandbookOperation { NSString *filePath; NSFileHandle *file; NSURLConnection * […]

ios NSOperationQueue,操作全部运行时添加并且不排队

所以,我有一组ASINetworkQueues,当前一起运行导致DB保存竞争条件。 我想创build一个NSOperationQueue,将排队这些“子队列”中的每一个。 我目前已经创build了一个主要的方法,启动“子队列”开始下载NSOperation。 我的问题是,每次我使用“addOperation”添加一个子队列到主队列,它会直接触发“main”方法,所以我的子队列同时运行。 我印象深刻的主要方法是一次被解雇。 即仅用于队列顶部的操作。 也许我错过了这里的东西,但我似乎无法弄清楚如何拖延其他操作,直到第一个完成。 此外,我似乎甚至不能让我的程序进入NSOperation isReady = 0的情况下..总是给回答是的。 这里有一些代码: 注意:我已经将NSOperation队列maxConcurrentOperations设置为1。 NSOperation主要方法: -(void)main { [subQueue download]; } 设置队列: ChapterDownloadOperation *cdo = [[ChapterDownloadOperation alloc] init]; cdo.chapter = ch; [chapterDownloadQueue addOperation:cdo]; [cdo release]; 如果我添加多个操作,则主方法会在添加到队列的实例上触发。 是否有另一个function,我应该重写和使用,当操作准备摇摆。 我有一个感觉,主要的方法是设置操作。 任何想法不胜感激。 非常感谢。

在目标C中序列化asynchronous任务

我希望能够序列化“真正的”asynchronous方法,例如: 提出networking请求 显示一个UIAlertView 这通常是一个棘手的业务,大多数串行队列样本在NSBlockOperation的块中显示“睡眠”。 这不起作用,因为操作只在callback发生时完成。 我已经通过inheritanceNSOperation来实现这个,下面是实现中最有趣的部分: + (MYOperation *)operationWithBlock:(CompleteBlock)block { MYOperation *operation = [[MYOperation alloc] init]; operation.block = block; return operation; } – (void)start { [self willChangeValueForKey:@"isExecuting"]; self.executing = YES; [self didChangeValueForKey:@"isExecuting"]; if (self.block) { self.block(self); } } – (void)finish { [self willChangeValueForKey:@"isExecuting"]; [self willChangeValueForKey:@"isFinished"]; self.executing = NO; self.finished = YES; [self didChangeValueForKey:@"isExecuting"]; [self didChangeValueForKey:@"isFinished"]; […]

NSAutoreleasePool。 什么时候适合创build一个新的自动释放池?

在iOS / CocoaTouch上,我经常看到代码在一个方法中创build一个新的NSAutoreleasePool实例。 我最近看到一个在NSOperation内。 设置NSAutoreleasePool的新实例的基本规则是什么? 为什么这样做比单纯依靠在main.m中创build的预先存在的发布池更好? 谢谢, 道格

处理HTTPnetworking连接变化的最佳方法

通常,在我使用相当多HTT​​P请求与服务器进行通信的iOS应用程序中,我将NSBlockOperation添加到应用程序的全局NSOperationQueue中,然后在应用程序检测到Internet连接状态更改时挂起并启用队列,从而保存当前在队列中的请求,直到队列被取消暂停。 但是,我并不完全确定,这样,当前正在运行的任何操作都将被停止,然后重新添加到队列顶部。 我的问题是:有没有更好的方法来处理networking状态的变化,当你正在使用HTTP请求到远程服务器,即暂停,恢复,取消请求等…

取消NSOperation for循环?

我试图在iOS上使用NSOperation在后台线程上执行search。 我不想要NSOperation子类,所以这就是我正在做的事情: [searchQueue cancelAllOperations]; NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self elector:@selector(filterContentForSearchText:) object:self.searchDisplayController.searchBar.text]; [searchQueue addOperation:op]; [op release]; search方法包括一个for循环,用于检查正在search的内容是否在数组中。 现在,当我通过调用cancelAllOperations取消NSOperation ,for循环继续在数组中运行。 我想阻止这一点,并想知道在for循环中调用它是否合法: if ([[[searchQueue operations] objectAtIndex:0] isCancelled]) { [tmp_array release]; // tmp_array is used to hold temporary results [pool drain]; // pool is my autorelease pool return; }

在NSOperation中使用委托

我想在NSOperation使用CLLocationManager 。 作为这个的一部分,我需要startUpdatingLocation的能力,然后等待,直到收到一个CLLocation完成操作。 目前我做了以下工作,但是这个委托方法似乎从来没有被调用过。 请有人build议是什么问题? – (void)main { @autoreleasepool { if (self.isCancelled) return; // Record the fact we have not found the location yet shouldKeepLooking = YES; // Setup the location manager NSLog(@"Setting up location manager."); CLLocationManager *locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBest; [locationManager startUpdatingLocation]; while (shouldKeepLooking) { if (self.isCancelled) […]

NSInvocationOperation和NSBlockOperation有什么区别?

Foundation Framework中有三个操作类( NSOperation , NSInvocationOperation和NSBlockOperation )。 我已经阅读了并发编程指南,但是我不明白这三个类之间究竟有什么区别。 请帮帮我。

NSOperation阻止UI绘画?

我在使用NSOperation和绘图之后有一些build议: 我有一个主线程创build我的NSOperation子类,然后将其添加到NSOperationQueue 。 我的NSOperation做了一些繁重的处理,它打算在main()方法中循环几分钟,不断地处理一些工作,但是现在我只是有一个while()循环,里面有一个sleep(1),它被设置为5次左右(testing)。 产生这个NSOperation的主(原始)线程负责绘制到视图和更新UI。 我打算让NSOperation线程使用一个通知来告诉主线程它已经完成了一些处理,现在这个通知每一次发送一次,通过它的while()循环发送一次(也就是每秒一次,因为它只是在睡觉(1))。 主线程(视图),注册以接收这些通知。 通知立即通过主线程,看起来asynchronous,看起来很好。 看来,两个线程按预期运行…这是 – 同时。 (我使用NSLog()只是大致检查每个线程发送和接收通知)。 当视图接收到一个通知,并且它的处理方法被调用时,我只需递增一个整型variables,然后试着将其绘制到视图中(作为一个当然的string)。 在testing中,drawRect中的代码:将这个整数(作为string)绘制到屏幕上。 然而,这里是我的问题(对不起,需要一点时间来到这里):当主线程(视图)从NSOperation接收到通知时,它更新此testing整数并调用[self setNeedsDisplay]。 但是,直到NSOperation完成之后,视图才会重绘! 我期望NSOperation,作为一个单独的线程,将无法阻止主线程的事件循环,但似乎这是发生了什么事情。 当NSOperation完成并且它的main()返回时,视图最终重新绘制自己。 也许我没有正确使用NSOperation 。 我在“非并发”模式下使用它,但尽pipe名字我的理解是,这仍然产生一个新的线程,并允许asynchronous处理。 任何帮助或build议非常感谢,如果你想看到一些代码只是让我知道。

在iOS中通过HTTP获取图像时不断增长的内存分配

我正在实现一个需要通过HTTP获取大量图像的iOS应用程序。 我已经尝试了几种方法,但独立我做什么,Instuments显示不断增加的内存分配和应用程序迟早崩溃,当我在设备上运行它。 仪器没有显示泄漏。 到目前为止,我已经尝试了以下几点: 在NSOperation中使用同步NSURLConnection获取图像 在NSOperation中使用asynchronousNSURLConnection获取图像 在主线程中使用[NSData dataWithContentsOfURL:url]获取图像 在NSOperation中使用同步ASIHTTPRequest获取图像 使用asynchronousASIHTTPRequest获取图像并将其添加到NSOperationQueue 使用asynchronousASIHTTPRequest并使用completionBlock获取图像 Instrumetns中的调用树显示内存在处理HTTP响应时被占用。 在asynchronousNSURLConnection的情况下, – (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [receivedData appendData:data]; } 在同步NSURLConnection的情况下,Instruments显示一个正在增长的CFData(存储)条目。 ASIHTTPRequest的问题似乎与在类似的代码位置的asynchronousNSURLConnection相同。 这个[NSData dataWithContentsOfURL:url]方法显示了在exactely那个语句中增加的总内存分配量。 当请求在一个单独的线程完成时,我正在使用一个NSAutoReleasePool,我试图用[[NSURLCache sharedURLCache] removeAllCachedResponses]释放内存 – 没有成功。 任何想法/提示解决问题? 谢谢。 编辑:行为只显示如果我坚持图像使用CoreData。 这里是我作为NSInvocationOperation运行的代码: -(void) _fetchAndSave:(NSString*) imageId { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *url = [NSString stringWithFormat:@"%@%@", kImageUrl, imageId]; HTTPResponse *response = […]