Tag: nsoperation

iOS:运营(NSOperations)-为什么又来了?

GCD或运营 每当我问这两种排队任务方法之间的区别时,我都会得到类似的响应: 随便使用GCD 使用GCD进行简单的单个异步调用 但在以下情况下使用“ 操作” 你想取消他们 您想要一次执行更多任务 当您要在依赖关系中执行它们时 当您想优先执行时 这些建议听起来像GCD会缺少Operations的某些核心功能,但有人反复说Operations或多或少是围绕GCD的包装。 好吧,后者当然是正确的,而且运营似乎没有什么特别之处,您对GCD所做的事情实际上并不多,实际上,很多事情都以一种更轻松的方式,更易读,尽管个人偏见可能会起到一定的作用。与我们生活中的一切息息相关。 我可以在某种程度上说,Operations不能完全实现通过封装进行简单分配的任务,因为至少就我个人而言,仅使用GDC似乎更容易实现太多事情。 误解 但是,我认为应该对操作存在一些真正的误解: 1.取消应用程序并不会发生。 开发人员必须实现取消并在属性上设置KVC才能实现这一点, OperationQueue只是侦听它。 取消的实现方式与您在GCD中执行的方式相同。 这里没有魔术! 例如,如果需要取消异步URLSession ,则必须使用KVC更改状态以通知OperationQueue ,但是您仍然必须自己实现取消URLSession 。 实际上,您在这里还需要进行其他操作。 2.也可以使用 DispatchGroup 轻松地原子地执行任务组 ,这并不是OperationQueues能够单独执行的,实际上,使用GCD 可以使任务组更短,更容易且更精简。 3.再次依赖,当使用OperationQueue时,不要只是开箱即用。 需要预先将操作链接为从属链接,并完成isFinish的所有开销,并且需要实现其余样板,以便该机制起作用。 我会说,在GCD的串行队列上使用Dispatch更具可读性,更容易理解,特别是在存在更多后续任务的情况下。 但是,如果要同步的任务本身本质上是异步的,则GCD变得更加易于使用。 如果只有一个附加的依赖关系,那么我们可以嵌套第二个任务。 如果还有更多,那么使用DispatchGroups是一件很容易的事情…… 当依赖关系可能在单个任务和任务组之间时,还有很多要显示的东西,这就是GCD在操作性方面比操作性更出色的地方。 不过,这并不是经常发生的用例,因此,这并不是一个巨大的优势。 缺点 但是,恕我直言,使用Operations存在一些实际缺点,我不想重复样板代码的开销,我相信这是大多数人在比较这些方法时唯一提到的事情。 这里还有更多重要的事情要提到: Operations是NSOperations ,正在为所有子类带来动态分配。 目前还没有Swift的对手,并且有理由相信不会因为这里提到的接下来的几件事 他们使用KVC和KVO ,这在Swift中仍然是未知的概念,并且极不可能在不久的将来实现。 我们没有Operation结果的无状态返回,因为Operation的completementBlock无效。 因此,我们需要在Operation上创建可读的属性(状态),以便将结果传回。 任何一种附加状态都会导致附加的内存管理复杂性 Operations可以吸引开发人员“统一”使用它们,即使是琐碎的任务,也可以包装简单的代码以“遵循方法”…… 单元测试中的复杂性更高,需要制作一些帮助程序OperationQueue模拟以能够正确测试它 有时它们只是成为所有业务逻辑的转储,几乎违反了所有SOLID原则。 如果有的话, Operations应该大部分都是样板,仅带有1+个方法调用和1+个结果属性,恕我直言。 同样,在观看WWDC […]

在Swift中使用NSOperation和NSOperationQueue在UICollectionView中进行延迟加载

在Flickr上创建帐户后,您必须生成api密钥并将该api密钥替换为搜索URL中的“ ”。 由于这不是有关Flickr服务的教程,因此我们将不再赘述。 搜索Flickr之前,需要输入API密钥。 与Flickr api调用和图像数据相关的类已经创建并包含在项目中,该项目的链接在本教程的最后提供。 在本教程中无法编写和解释整个代码,请参考所有代码片段以从项目中提供的类中获得详细的了解。 该项目包包含两个类和一个专用于执行基于Flickr的任务的结构: FlickrSearchResults :一种结构,用于包装搜索词和为该搜索找到的结果。 FlickrPhoto :从Flickr检索的照片的数据模型-其元数据信息,例如其ID。 还有一种构建Flickr URL和一些大小计算的方法。 FlickrSearchResults包含这些对象的数组。 Flickr :提供一个简单的基于块的API来执行搜索并返回FlickrSearchResult 随意看一下代码-这很简单,可能会激发您在自己的项目中使用Flickr! 打开Flickr.swift并将apiKey的值替换为apiKey获得的API密钥。 它看起来应该像这样: 当您准备好开始时,请转到下一部分-是时候进行一些准备工作,然后再熟悉Flickr。 准备图像数据 打开SearchViewController.swift ,您将在其中找到两个属性: var searchs = [FlickrSearchResults]() 让 flickr = Flickr() searches是一个数组,将跟踪应用程序中进行的所有搜索,而flickr是对将为您进行搜索的对象的引用。 创建图像下载管理器 ImageDownloadManager类将创建一个单例实例,并具有NSCache实例来缓存已下载的图像。

如何使用调度gcd与NSOperationQueue和NSBlockOperation?

这是代码 @interface ViewController () @property (nonatomic, strong) NSOperationQueue *queue; @end @implementation ViewController – (void)viewDidLoad { [super viewDidLoad]; _queue = [[NSOperationQueue alloc] init]; NSBlockOperation *aBlockOperation = [[NSBlockOperation alloc] init]; __weak NSBlockOperation* aWeakBlockOperation = aBlockOperation; [aBlockOperation addExecutionBlock:^{ NSLog(@"queue should still have the operation. And it does. yay!: %@", [_queue operations]); // This should print correctly. It will […]

NSOperationQueue似乎performance缓慢

我是NSOperationQueue的新手,但是在当前的项目中,我需要一种取消asynchronous操作的方法。 我原来的代码使用GCD和工作。 这里是: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ rg = [[RiverGauge alloc] initWithStationInfo:[station id] forHistoryInHours:48 inThisFormat:nil]; dispatch_async(dispatch_get_main_queue(), ^{ [hud removeFromSuperview]; UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; GaugeViewController *vc = [sb instantiateViewControllerWithIdentifier:@"GaugeDetailViewController"]; [vc setRiverGauge:rg]; [self.navigationController pushViewController:vc animated:YES]; }); }); RiverGauge是一个可能需要很长时间的networking操作,特别是当用户在农村时。 我见过的大多数post都build议将其移入NSOperationQueue。 我做了如下: NSOperationQueue *queue = [NSOperationQueue new]; NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(getGaugeDetail:) object:[station id]]; [queue addOperation:op]; 在getGaugeDetail方法(在select器参数)中,我有以下代码: […]

并发NSOperation和如何设置已完成并正在执行?

我正在尝试使用NSOperations分离我的程序stream程。 我正在使用Parse框架来制作一个简单的消息应用程序。 我想显示一些消息,然后删除它们。 显示消息不应该被调用,除非删除操作完成,所以我想尝试使用NSQueue,并添加一个displayMessages操作,然后deleteMessages操作(下面的名为MyOperation)。 我知道并发操作意味着它们只能以一种接一个的队列方式执行。 以下是我的代码为删除方法。 有没有办法手动告诉操作完成,即设置isFinished或isExecuting? // MyOperation.h @interface MyOperation : NSOperation { @property (strong, nonatomic) NSMutableArray *toDelete; } @end And the implementation: // MyOperation.m @implementation MyOperation – (id)initWithArray:(NSMutableArray *)array { self = [super init]; if (self == nil) return nil; _toDelete=array; } – (void)main { if ([self isCancelled]) { NSLog(@"** operation cancelled **"); […]

检查两个NSOperationQueue是否完成调用endBackgroundTask来停止后台任务模式

在我的应用程序中,我有一些NSOperation从一个在线数据库更新一些核心数据元素,有时更新需要一些分钟,当iPhone的屏幕locking,应用程序进入后台模式,并停止此更新,所以我有重新打开应用程序继续更新,所以我已经问了一些在这之前,所以我收到了这个正确的答案: – (void)someMethodToKeepRunningInBackground { UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) { // Uh-oh – we took too long. Stop task. }]; // Perform task here CheckForUpdate *checkUpdate = [[CheckForUpdate alloc] init]; [sectionCheckUpdateQueue addOperation:checkUpdate]; if (taskId != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:taskId]; } } 问题是,我有更多的NSOperationQueue运行来执行更新,我上面写的sectionCheckUpdateQueue,如果发现更新日程安排更NSOperation其他NSOperationQueue,所以我不能调用这个: endBackgroundTask:taskId 因为我不知道什么时候这个NSOperationQueue完成,所以我的问题是,所以如何我可以检测到当这个NSOperationQueue完成,所以调用endBacgkround:taskId?

按照AFNetworking的顺序下载图像

你如何下载AFNetworking的图像? 一个“按顺序”,我也是指按顺序执行success块。 最初,我认为这足以使用NSOperationQueue ,并将每个AFImageRequestOperation设置为下一个的依赖项。 喜欢这个: – (void) downloadImages { { // Reset [_downloadQueue cancelAllOperations]; _downloadQueue = [[NSOperationQueue alloc] init]; _images = [NSMutableArray array]; } AFImageRequestOperation *previousOperation = nil; for (NSInteger i = 0; i < _imageURLs.count; i++) { NSURL *URL = [_imageURLs objectAtIndex:i]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil success:^(NSURLRequest […]

NSOperation与完整块

我有一些image processing需要很多时间和资源,所以我使用NSOperation + NSOperatioQueue +委托为callBack。 和所有的工作。 现在我想要使用块,因为它在桌面视图中使用非常优雅和简单。 我需要做的只是像AFJSONRequestOperation例如: NSURL *url = [NSURL URLWithString:@"url"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSLog(@"App.net Global Stream: %@", JSON); } failure:nil]; [operation start]; 在这个例子中,我没有看到任何操作Queue! 我怎么能这样做? [ImageManagerOperation modifyImage:(UIImage*)image completitionBlock:(void (^)(UIImage *modifiedImage))complete]; ImageManagerOperation是一个NSOperation。 我知道我可以设置一个完成块,但我仍然需要在队列中添加操作。 我想尽量减less我的代码中的行号(如果可能:))。

如何让UITableViewCell图像更新到下载的图像,而不必滚动UITableView

我试图拉我平常的UITableView +asynchronous下载+caching技术自己的味道。 我正在做的是,对于cellForRowAtIndexPath中出现的每个单元格: 1-Check if it's corresponding thumbnail image is already 'cached' in /Library/Caches 2-If it is, just use that. 3-If not, load a default image and enqueue an NSInvocationOperation to take care of it: 4a-The NSInvocationOperation gets the image from a remote server 4b-Does the UIGraphicsBeginContext thing to scale down the image to 40×40 […]

在NSOperation中取消NSData initWithContentsOfURL

我目前有一个NSOperation有keyPath“isCancelled”的观察员下面的代码: downloaded = FALSE; NSURL *url = [NSURL URLWithString:requestString]; dataXML = [[NSData alloc] initWithContentsOfURL:url]; downloaded = TRUE; 我想这样做的是,那么obserValueForKeyPath函数可以取消继续dataXML,或只是完全停止NSOperation一旦NSOperation发送取消消息。 NSOperation的取消操作取消只是通知操作应该停止,但不会强制我的操作代码停止。