Tag: nsoperationqueue

NSOperationQueue – 完成调用太早

我正在使用一个NSOperationQueue队列和调用一些地理编码位置查找。 当所有asynchronous运行的查找完成后,我想调用一个完成方法。 -(void)geocodeAllItems { NSOperationQueue *geoCodeQueue = [[NSOperationQueue alloc]init]; [geoCodeQueue setName:@"Geocode Queue"]; for (EventItem *item in [[EventItemStore sharedStore] allItems]) { if (item.eventLocationCLLocation){ NSLog(@"-Location Saved already. Skipping-"); continue; } [geoCodeQueue addOperationWithBlock:^{ NSLog(@"-Geocode Item-"); CLGeocoder* geocoder = [[CLGeocoder alloc] init]; [self geocodeItem:item withGeocoder:geocoder]; }]; } [geoCodeQueue addOperationWithBlock:^{ [[NSOperationQueue mainQueue]addOperationWithBlock:^{ NSLog(@"-End Of Queue Reached!-"); }]; }]; } – […]

在不使用ARC时替代__weak

我有这样的代码行: __weak NSBlockOperation *weakOperation = operation; 这是触发这个编译器错误: __weak attribute cannot be specified on automatic variable. 原因是我没有启用ARC(尚未准备好进行切换)。 所以从另一个StackOverFlow问题,我被推荐使用: __unsafe_unretained NSBlockOperation *weakOperation = operation; 这使得错误消失,但对于我使用它的上下文,它不工作(如果感兴趣,请参阅此问题: 如何取消NSOperationQueue )。 所以我的问题是,在这个例子中,我可以用__weak关键字替代__weak这个警告? 当我使用__weak ,所有的东西都能正确的工作,但是恐怕它不能支撑未来版本的iOS。

取消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; }

使用单个共享后台线程进行iOS数据处理?

我有一个应用程序,我正在从networking上下载一些资源,并对每一个进行一些处理。 我不希望这个工作在主线程上发生,但是它是非常轻量级和低优先级的,所以它们都可以在同一个共享工作线程上发生。 这似乎是一件好事,因为需要设置和拆除所有这些工作线程(这些线程都不会很长,等等)。 令人惊讶的是,似乎没有一种简单的方法可以让所有这些工作都在一个共享的线程上进行,而不是为每个任务产生一个新的线程。 实现并发的途径多年来似乎已经出现,这很复杂。 (显式NSThreads , NSOperationQueue ,GCD等) 我是否高估了产生所有这些线程的开销? 我应该只是没有汗水,并使用更容易的每个任务的方法? 使用GCD,并假定它比我更聪明的线程(重新)使用?

我怎样才能更好地优化iOS上的networking?

我已经在GitHub上创build了一个项目,所以我可以学习如何优化iOS应用程序的networking。 我大量使用了块和GCD,在看过去几年的WWDC 2012video和video之后,我了解到我可以用NSOperationQueue做更多。 具体来说,我可以控制并发操作(networking连接)的数量,并提供取消操作。 我正在尝试允许1,2,4,8和16个并发操作,并且我看到有趣的结果,我并不完全期望。 我正在测量结果,但我想知道是否还有更多我应该测量。 你可以在这里find示例项目: https://github.com/brennanMKE/OptimizedNetworking 由于我使用NSURLConnection的asynchronousAPI,所以有许多并发连接的好处,因为API花费了相当长的时间来等待HTTP数据包。 以前,我的代码将从一系列项目开始下载,并按顺序请求它们,这就阻止了并发的好处。 我也一直在使用通知取消networking连接。 现在我可以通过操作来完成这个项目,我已经设置好它们来使用一个优先级和一个类别的值,这样我可以优先化和sorting下载并取消一个操作类别。 我可以select为每个视图使用一个类别,当用户离开视图时,该视图的所有操作将被使用该类别取消。 这将释放活动视图的资源。 一个使用更多并发操作的问题是CPU使用率和I / O,但是我不知道用iOS测量这些值的方法。 iOS中用于显示CPU使用率的“w”命令相当于是有用的。 我不太关心I / O,但是测量它会更全面。 我如何做networking的主要问题是响应式用户界面。 我发现我一直在做的事情导致了UI的低迷。 这种新的方法可能会有很大的帮助,但只有当我保持并发操作的数量下降。 连接types(3G,WiFi等)的最佳操作数可能会有所不同,因此检查连接types可能会导致一些优化。 如果您有兴趣通过更好的方式来加速您的应用程序中的networking通信,请尝试此示例项目,并提出其他方法来衡量性能并提供进一步优化通信的方法。 (另外请注意,我正在引用Apple示例项目MVCNetworking以及ASIHTTPRequest项目。 接下来我要做的就是总计下载的数据量,并logging下这个数量以及完成下载的总时间。 自述文件应该有助于解释项目及其工作原理。

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议非常感谢,如果你想看到一些代码只是让我知道。

用依赖pipe理一堆NSOperation

我正在创build一个创build内容并将其发送到现有后端的应用程序。 内容是标题,图片和位置。 没有什么花哨。 后端有点复杂,所以这是我必须做的: 让用户拍照,input标题并授权地图使用其位置 为post生成一个唯一的标识符 在后端创buildpost 上传图片 刷新用户界面 我已经使用了几个NSOperation子类来完成这个工作,但是我并不为自己的代码感到自豪,下面是一个示例。 NSOperation *process = [NSBlockOperation blockOperationWithBlock:^{ // Process image before upload }]; NSOperation *filename = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(generateFilename) object: nil]; NSOperation *generateEntry = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(createEntry) object: nil]; NSOperation *uploadImage = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(uploadImageToCreatedEntry) object: nil]; NSOperation […]

NSOperationQueue mainQueue vs performSelectorOnMainThread?

这有什么区别: [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self doSomthing:object]; }]; 和这个: [self performSelectorOnMainThread:@selector(doSomething:) withObject:object waitUntilDone:NO]

GCD,NSThread或NSOperationQueue中哪一个最好?

我们有三个选项GCD, NSThread和NSOperationQueue ,iOS中multithreading的最佳方式是什么? 我很困惑哪一个是最好的? 如果没有,那么应该在什么情况下使用,以及它们如何不同,以及如果有人使用NSOperationQueue一些很好的例子,请分享,以便我可以学习。

学习NSBlockOperation

我是一个块的粉丝,但没有使用它们的并发性。 经过一番谷歌search之后,我把这个想法拼凑起来,把我在一个地方学到的所有东西都隐藏起来。 目标是在后台执行一个块,当它完成时,执行另一个块(如UIViewanimation)… – (NSOperation *)executeBlock:(void (^)(void))block completion:(void (^)(BOOL finished))completion { NSOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:block]; NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{ completion(blockOperation.isFinished); }]; [completionOperation addDependency:blockOperation]; [[NSOperationQueue mainQueue] addOperation:completionOperation]; NSOperationQueue *backgroundOperationQueue = [[NSOperationQueue alloc] init]; [backgroundOperationQueue addOperation:blockOperation]; return blockOperation; } – (void)testIt { NSMutableString *string = [NSMutableString stringWithString:@"tea"]; NSString *otherString = @"for"; NSOperation *operation = [self […]