Tag: grand central dispatch

为什么在处理主线程上的大量任务时,NSOperationQueue比GCD或者performSelectorOnMainThread更快?

例如,我有100次for循环。 并需要更新UIImageView,最后2种方法是一样的慢。 为什么? 他们之间有什么不同? //fastest [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [btnThumb setImage:[UIImage imageWithData:data] forState:UIControlStateNormal]; [scrollView addSubview:btnThumb]; }]; //slowly dispatch_async(dispatch_get_main_queue(), ^ { [btnThumb setImage:[UIImage imageWithData:data] forState:UIControlStateNormal]; [scrollView addSubview:btnThumb]; }); //slowly [btnThumb setImage:[UIImage imageWithData:data] forState:UIControlStateNormal]; [self performSelectorOnMainThread:@selector(testMethod:) withObject:[NSArray arrayWithObjects:scrollView, btnThumb, nil] waitUntilDone:NO]; -(void) testMethod:(NSArray*)objs { UIScrollView *scroll = [objs objectAtIndex:0]; UIButton *btn = [objs lastObject]; [scroll addSubview:btn]; }

dispatch_async中的asynchronousurl请求

我试图在一个特定的函数中实现asynchronousurl请求,我想要完成所有这些请求,然后执行一个特定的操作,但该操作先于请求,即在请求完成之前调用它。 dispatch_queue_t fetchQ = dispatch_queue_create("Featured Doc Downloader", NULL); dispatch_async(fetchQ, ^{ [self myAsyncMultipleURLRequestFunction]; dispatch_sync(dispatch_get_main_queue(), ^{ [self updateUIFunction]; }); }); -(void)myAsyncMultipleURLRequestFunction { for (int i=0; i<count; i++) { NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; } } 现在在myAsyncMultipleURLRequestFunction完成所有请求之前调用updateUIFunction。 也试过这与NSOperaitonQueue,但不能做我真正想要的。 [_operationQ addOperationWithBlock: ^ { for (int i=0; i<count; i++) { NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; } […]

NSInputStream停止运行,有时会抛出EXC_BAD_ACCESS

(更新)这是一个简单的问题:在iOS我想读一个大文件,做一些处理(在这种情况下编码为Base64string()并保存到设备上的临时文件。一个NSInputStream从文件中读取,然后进入 (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode 我正在做大部分的工作。 出于某种原因,有时我可以看到NSInputStream停止工作。 我知道,因为我有一条线 NSLog(@"stream %@ got event %x", stream, (unsigned)eventCode); 在(void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode的开始(void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode ,有时我会看到输出 stream <__NSCFInputStream: 0x1f020b00> got event 2 (对应事件NSStreamEventHasBytesAvailable),然后什么也没有。 不是事件10,它对应于NSStreamEventEndEncountered,不是一个错误事件,什么都没有! 有时候我甚至会得到一个EXC_BAD_ACCESSexception,我现在还不知道如何debugging。 任何帮助,将不胜感激。 这是实施。 当我点击一个“提交”button时,一切都开始了,这会触发: – (IBAction)submit:(id)sender { [p_spinner startAnimating]; [self performSelector: @selector(sendData) withObject: nil afterDelay: 0]; } 这里是sendData: -(void)sendData{ … _tempFilePath = … ; [[NSFileManager defaultManager] createFileAtPath:_tempFilePath […]

取消dispatch_after()方法?

有没有办法取消dispatch_after()预定一段时间以后,到目前为止还没有开火? 我正在尝试为服务器上的更新做一个调度程序,而这个方法就像我想要的,但是,我希望在某个时候取消并重新调度它。 是否有可能,或者我必须回退并使用NSTimer?

iOS应用程序的操作队列与调度队列

Operation Queue和Dispatch Queue有什么区别? 在什么情况下使用它们会更合适?

无形的执行顺序(dispatch_semaphore_t,dispatch_group_async)及其与不同调度队列types组合使用

我只是花了一些时间在晚上玩GCD,特别是dispatch_semaphore_t因为我从来没有使用它。 从来没有需要。 所以我写了下面这个testing: – (void)viewDidLoad { UIView *firstView = [[UIView alloc] initWithFrame:(CGRect){{0, 0}, self.view.frame.size.width/4, self.view.frame.size.width/5}]; firstView.backgroundColor = [UIColor purpleColor]; [self.view addSubview:firstView]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ { for (long i = 0; i < 1000; i++) { sleep(5); dispatch_async(dispatch_get_main_queue(), ^ { firstView.layer.opacity = ((i%2) ? 0: 1); }); } }); dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group1 […]

如何杀死/暂停/closuresGCD中的asynchronous块?

我已经实现了一个使用GCDasynchronous调度的块,如下所示: __block BOOL retValue; dispatch_async(dispatch_get_global_queue(0, 0), ^{ retValue = [self GCDHandler:actionName WithServiceType:serviceType :arguments]; }); return retValue; 如果运行时间比我想要的长,我该如何取消这样的模块? 有没有办法取消GCD调度的块,或提供超时?

dispatch_sync总是在主线程上调度一个块

我正在使用dispatch_sync执行一个块,并且块被正确执行。 但是这个块在主线程上执行。 根据Apple Doc: 串行队列(也称为私有调度队列)按照将其添加到队列中的顺序一次执行一个任务。 当前正在执行的任务运行在由调度队列pipe理的不同线程上(可能因任务而异)。 这意味着(或我所理解的)当前正在执行的进程将在单独的线程上运行。 下面是我用来判断发生了什么的代码。 它在NSURLConnection的didReceiveData: delegate方法中被调用(我知道我不应该在didReceiveData:delegate方法内部这样做 – 但这只是一个关注dispatch_sync的示例)。 以下是我可以作为我的结论certificate的不同方式: 在全局并发队列上使用dispatch_sync dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ if ([NSThread isMainThread]) { NSLog(@"Main Thread"); } else NSLog(@"Not on Main Thread"); //Some Process }); 输出 – Main Thread Main Thread Main Thread // Main Thread printed till didReceiveData: gets called 在使用dispatch_queue_create的自创队列上使用dispatch_sync // Create queue somewhere else like […]

iOS上的runloop中的操作顺序

iOS上的操作顺序是什么? 我正在考虑关于时机 setNeedsLayout和layoutSubviews setNeedsDisplay和drawRect 触摸识别 [NSTimer scheduledTimerWithTimeInterval:0.000001 tar(…)] dispatch_async(dispatch_get_main_queue(), ^{ /* code */} 作为一个答案的例子,我想收到它可能是这样的格式: main上的dispatch_async在下一个运行周期之前发生 drawRect在运行周期结束时发生

将字块中的块保留

我有我自己的方法,把块作为一个参数。 我想跟踪在NSDictionary内的块。 将字块添加到字典的最佳方法是什么? 我试过这个代码,但执行下面的行(setObject …)后,字典仍然是空的。 我认为这是因为该块不是NSObjecttypes。 但是,这样做的正确方法是什么? – (void)startSomething:(NSURLRequest*)request block:(void (^)(NSURLResponse*, NSData*, NSError*))handler { NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; [pendingRequests setObject:handler forKey:connection]; } 编辑: 没关系。 我不知道我在想什么。 3分: 块是objc对象 Typo:setObject应该是setValue forKey是一个string,所以它应该是[连接描述]或类似的东西 无论如何,我现在解决我的问题是这样的: – (void)startSomething:(NSURLRequest*)request block:(void (^)(NSURLResponse*, NSData*, NSError*))handler { NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; [pendingRequests setValue:handler forKey:[connection description]]; } – (void)connectionDidFinishLoading:(NSURLConnection *)connection { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, […]