Tag: nsoperationqueue

NSOperationQueue与同步的NSURLConnection

在前面的问题的基础上:我有一个NSOperationQueue ,看起来像这样: NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{ [someObject someSelector]; }]; NSBlockOperation *block2= [NSBlockOperation blockOperationWithBlock:^{ [someObject anotherSelector]; }]; [block2 addDependency:block1]; [queue addOperation:block1]; [queue addOperation:block2]; 现在,在someSelector我有: returnData = [requesterObj getDataWithURL:(NSString*)url]; getDataWithURL包含如下所示的内容: NSURL *requestUrl = [NSURL URLWithString:strUrl]; NSMutableURLRequest *request = [NSMutableURLRequest requestUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:timeout]; NSError *requestError; NSURLResponse *urlResponse = nil; NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError]; 现在,当我添加断点时,看起来第二个块在第一个块的NSURLConnection完成之前被调用。 […]

如何触发NSOperationQueue并获得多个操作块的结果

我已经问过与NSOperationQueue有关的问题,但是我仍然在用multiples操作实现操作队列。 我有以下代码 NSMutableArray * operationArray = [[NSMutableArray alloc] init]; for (int i =0; i<[documentModelList count]; i++) { DocumentModel * documentModel = [documentModelList objectAtIndex:i]; NSString *url = [NSString stringWithFormat:@"%@%@/%li", SERVER_URL, DOCUMENTS_DELETE,(long)documentModel.documentID]; [operationArray addObject:[AppHttpClient getDeleteRequest:nil urlQuery:url]]; } NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; // Set the max number of concurrent operations (threads) [operationQueue setMaxConcurrentOperationCount:operationArray.count]; [operationQueue addOperations:operationArray waitUntilFinished:NO]; […]

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?

使用GCD完成块

我正在开发一个需要完成块和“障碍”function的应用程序。 据我所知, NSOperation API有一个completionBlock属性,GCD API有dispatch_barrier_(a)sync函数来处理屏障需求。 为了完成这两个需求,我该怎么做? 谢谢!

NSOperationQueue addOperationWithBlock返回mainQueue的操作顺序

我有一个基本的问题,如何操作顺序进入NSOperationQueue addOperationsWithBlock 。 我想做的事: [_queue addOperationWithBlock:^{ //starts a new thread to download an image //returns a response from the server if (returnResponse != nil) { //what I need to accomplish: //1) Update the collectionViewCell with data //2) Cache the image locally //3) Save the image name in local database } }]; 我不需要代码来做到这一点,我只需要知道它是如何工作的。 例如,如果我想立即为用户更新单元格,是否应该像这样马上拥有这部分代码? if (returnResponse […]

在NSOperationQueue非主队列上创buildUI元素会导致奇怪的行为

我有一些代码,通过由[[NSOperationQueue alloc] init]创build的队列创build和添加UIView子视图,并导致奇怪的laggy行为。 只有在延误时间过长之后才会添加子视图。 但后来我转而使用[NSOperationQueue mainQueue]来处理这些部分,并且响应性正常。 我只想解释一下我看到的使用第一种方法的滞后行为。

按照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我的代码中的行号(如果可能:))。