Tag: nsoperationqueue

在Objective C中设置for循环的最佳方法是什么?

我有一个像这样的循环时间密集的情况: int sum = 0; for (int i = 0; i < max; ++i) sum += dosomething(i); 做something(i)电话是独立的。 这呼吁multithreading。 在双核机器上使用NSOperationQueue,我可以这样做: int __block midpoint; int __block sum1; int __block sum2; midpoint = max/2; sum1 = 0; sum2 = 0; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSOperation *operation = [NSBlockOperation blockOperationWithBlock: ^{ for (int i = 0; […]

在单个NSOperationQueue中pipe理多个操作,如暂停/恢复单个操作

在我的代码中,我想单独处理一个队列中的操作,并能够暂停和恢复队列中的操作操作。 我怎样才能实现呢? 让我简单地解释我的问题,我已经使用下面的代码创build子类NSOperation的操作,并将此操作添加到NSOperationQueue。 @interface MyLengthyOperation: NSOperation @end @implementation MyLengthyOperation – (void)main { // a lengthy operation @autoreleasepool { for (int i = 0 ; i < 10000 ; i++) { // is this operation cancelled? if (self.isCancelled) break; NSLog(@"%f", sqrt(i)); } } } @end 我已经创build了上面的操作,我正在调用它 NSOperationQueue *myQueue = [[NSOperationQueue alloc] init]; myQueue.name = @"Download Queue"; […]

AFHTTPRequestOperations队列创build内存堆积

我刚刚更新到AFNetworking 2.0,我正在重写我的代码来下载数据并将其插入到Core Data中。 我下载JSON数据文件(从10到200MB的任何文件),将它们写入磁盘,然后将它们传递到后台线程来处理数据。 以下是下载JSON并将其写入磁盘的代码。 如果我只是让这个运行(甚至没有处理数据),应用程序使用内存,直到它被杀死。 我假设数据进入,它被存储在内存中,但是一旦我保存到磁盘,它为什么会留在内存中? 不应该autorelease池照顾这个? 我也设置了responseData和downloadData为零。 是否有明显的表明我在这里做错了? @autoreleasepool { for(int i = 1; i <= totalPages; i++) { NSString *path = …. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:path]]; AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; op.responseSerializer =[AFJSONResponseSerializer serializer]; [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { //convert dictionary to data NSData *downloadData = [NSKeyedArchiver archivedDataWithRootObject:responseObject]; […]

块很可能会导致一个保留周期

我为NSOperationBlock写了以下类别 @implementation NSOperationQueue (Extensions) -(void)addAsynchronousOperationWithBlock:(void (^)(block))operationBlock { dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); block signal = ^ { dispatch_semaphore_signal(semaphore); }; [self addOperationWithBlock:^{ operationBlock(signal); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_release(semaphore); }]; } @end 它似乎工作正常,但当我打电话(如下面的代码片段所示),我得到一个警告: 区块很可能会导致保留周期 [_queue addAsynchronousOperationWithBlock:^(block signal) { [self foo:nil]; signal(); }]; foo是使用这个类的类的一个方法。 与addOperationWithBlock:相同的代码addOperationWithBlock:来自NSOperationQueue )不显示警告: [_queue addOperationWithBlock:^ { [self foo:nil]; }]; 我真的不明白这一点。 特别是我不明白的是,在两种情况下,我应该使用弱指针吗? 实际上这两个片段会带来保留周期,以防我不使用弱指针?

当NSOperationQueue中的所有其他操作完成时,执行NSOperation,无论它们是否成功完成

嗨,我在这里有一个奇怪的情况: 概述: 我正在开发一个应用程序,用户可以启动多个操作,所有这些操作将在后台线程上运行,因此不会阻止用户界面。 其中一些操作是相互依赖的,有些则不是。 所以为了确保只有在所有必要的依赖项操作完成后才执行操作,使用Operation的依赖项属性执行。 我正在使用asynchronous操作。 这是我的实现: import UIKit import CoreData import SwiftyJSON class VMBaseOperation: NSOperation { var finishedStatus : Bool = false var executionStatus : Bool = false var retryCount : Int = 0 private (set) var requestToQueue : BaseRequest? = nil var vmOperationCompletionBlock: ((JSON?) -> Void)? var vmOperationFailureBlock: ((WebResponseError?) -> Void)? override init() […]

修复我的networking活动指标

我的networking活动指标存在问题,有时会在不应该显示的情况下继续显示。 我写了我自己的经理,并换了一个使用这样的NSAssert语句… – (void)setNetworkActivityIndicatorVisible:(BOOL)setVisible { static NSInteger NumberOfCallsToSetVisible = 0; if (setVisible) NumberOfCallsToSetVisible++; else NumberOfCallsToSetVisible–; // The assertion helps to find programmer errors in activity indicator management. // Since a negative NumberOfCallsToSetVisible is not a fatal error, // it should probably be removed from production code. NSAssert(NumberOfCallsToSetVisible >= 0, @"Network Activity Indicator was asked to […]

dispatch_after等同于NSOperationQueue

我将我的代码从常规GCD移到NSOperationQueue,因为我需要一些function。 我的很多代码依赖dispatch_after才能正常工作。 有没有办法与NSOperation做类似的事情? 这是我需要转换为NSOperation的一些代码。 如果你能提供一个使用这个代码来转换它的例子,那就太好了。 dispatch_queue_t queue = dispatch_queue_create("com.cue.MainFade", NULL); dispatch_time_t mainPopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeRun * NSEC_PER_SEC)); dispatch_after(mainPopTime, queue, ^(void){ if(dFade !=nil){ double incriment = ([dFade volume] / [self fadeOut])/10; //incriment per .1 seconds. [self doDelayFadeOut:incriment with:dFade on:dispatch_queue_create("com.cue.MainFade", 0)]; } });

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,我应该重写和使用,当操作准备摇摆。 我有一个感觉,主要的方法是设置操作。 任何想法不胜感激。 非常感谢。

如何取消NSOperationQueue

想知道如果我正确地执行下面的方法,因为isCancelled不取消线程。 我有一个图像,我缩放,当它完成缩放,调用此方法来更新图像。 所以当用户把手指从button上拿下时,这就是所谓的。 如果他们在完成之前尝试再次按下button,我会在队列上调用cancelAllOperations ,但它不起作用。 甚至不知道如果cancelAllOperations触发一个标志,或者如果我需要继续调用它来得到一个结果。 任何人都有这方面的见解? – (void) refreshImage { NSBlockOperation *operation = [[NSBlockOperation alloc] init]; __unsafe_unretained NSBlockOperation *weakOperation = operation; [operation addExecutionBlock: ^{ UIImage *image = [[self.graphicLayer imageForSize:self.size] retain]; if (![weakOperation isCancelled]) { [[NSOperationQueue mainQueue] addOperationWithBlock: ^{ self.image = image; [image release]; }]; } else { [image release]; return; } }]; [self.queue addOperation: […]

任何方式使dispatch_queue_t单线程工作?

这是我的代码: @interface MyObject () @property(nonatomic) dispatch_queue_t queue; @end @implementation MyObject { NSThread *_check; } – (id)init { self = [super init]; if (self) { _queue = dispatch_queue_create("com.Thread.queue", NULL); dispatch_async(_queue, ^{ _check = [NSThread currentThread]; //for ex. thread number = 3 //some code here… }); } return self; } – (void)someMethod:(MyObjClass *)obj { dispatch_async(_queue, ^{ //need […]