Tag: grand central dispatch

在UITableViewCellasynchronous加载图像

什么是超级非常简单的方法来加载UITableViewCell中的图像asynchronous地说给一个imageURL而不必inheritanceUITableViewCell,即:标准的UITableViewCell

在unit testing中,使用dispatch_asyc执行队列中传递的块

如果我dispatch_async在主队列上的一块像这样: -(void) myTask { dispatch_async(dispatch_get_main_queue(), ^{ [self.service fetchData]; }); } 在unit testing中,我可以通过手动运行主循环来执行主队列中传递的块: -(void)testMyTask{ // call function under test [myObj myTask]; // run the main loop manually! [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; // now I can verify the function 'fetchData' in block is called … } 现在,我有另一个类似的function,将块分派到主队列以外的连续队列: -(void) myTask2 { dispatch_async(dispatch_queue_create("my.sequential.queue", NULL), ^{ [self.service fetchData]; }); } […]

在UITableView,最好的方法来取消已经离开屏幕的单元格的GCD操作?

我有一个UITableView ,它使用GCDasynchronous地将URL中的图像加载到单元格中。 问题是如果用户popup150行,150个操作排队并执行。 我想要的是出队/取消那些吹过去的屏幕。 我该怎么做呢? 我的代码在这一点上(相当标准): – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath // after getting the cell… dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ if (runQ) { NSString *galleryTinyImageUrl = [[self.smapi getImageUrls:imageId imageKey:imageKey] objectForKey:@"TinyURL"]; NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:galleryTinyImageUrl]]; dispatch_async(dispatch_get_main_queue(), ^{ if (imageData != nil) { UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; cell.imageView.image = [UIImage imageWithData:imageData]; } }); […]

我怎样才能定期使用GCD在后台运行代码块?

我怎样才能定期使用GCD在后台运行代码块? 我正在尝试编写一个带有几个子系统的游戏引擎,比如渲染,物理,游戏逻辑等等。 一些任务应该是事件驱动的,但是一些(如物理系统)应该在背景中定期调用(例如在1/100秒之后)。 我创build了一个代码块,但是如何在后台定期运行这个块呢? GCD是正确的工具吗?

NSNotification与dispatch_get_main_queue

关于这个问题,我想知道是否有任何普遍接受的逻辑关于什么时候使用NSNotification,在你的主线程中使用观察者,还是使用GCD从后台线程派发工作到主线程? 看起来,通过观察器设置,你必须记得当你的视图卸载时拆掉观察者,但是你可靠地忽略了通知,当调度一个工作到主线程可能导致一个块被执行时,视图有被卸载。 因此,在我看来,通知应该会提高应用程序的稳定性。 我假设调度选项提供了我读过的GCD更好的性能? 更新: 我知道,通知和调度可以愉快地一起工作,在某些情况下,应该一起使用。 我试图找出是否有特定的情况下,应该/不应该使用。 一个例子:为什么我会select主线程来从调度块中发出通知,而不是只调度主队列上的接收函数? (显然在这两种情况下接收函数会有一些变化,但最终的结果看起来是一样的)。

Grand Central Dispatch(GCD)调度源标志

我最近从使用kqueue切换到GCD调度源来监视文件更改。 这个工作得很好,并导致了一个更简单的API。 我在这里logging了我的开关。 我唯一的问题是,现在我不能访问我能够在kqueue事件的标志。 例如对于kqueue,我能够检查文件是否被删除,重命名,或者它的属性被改变了如下: struct kevent event; … if(event.flag & EV_DELETE) { printf("File was deleted\n"); } 这个API不适用于GCD吗?还是需要为每个我想听的标志设置调度源。 或者最好使用kqueue,因为它提供了对发生的事件更大的可见性。

使用GCD加载asynchronousUITableViewCell图像

我目前正试图加载一个UITableView列表的Flickr照片(cs193p iOS斯坦福,分配5)。 为了避免UI阻塞事件,我推迟了每个单元格的缩略图下载到一个不同的队列中(但是将UI更新回主队列中)。 这段代码并不是asynchronous加载图像,但是一旦点击了UITableViewCell行就会添加一个缩略图。 (见下面的截图)。 任何想法我做错了什么? PS:我已经看了一些其他stackoverflow问题和苹果公司的LazyTableImages的例子,但我仍然相信,这是达到预期的结果最干净的方式。 谢谢! – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Photo List Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // Configure the cell NSDictionary *photo = [self.photoList objectAtIndex:indexPath.row]; if (photo != nil) { if ([[photo objectForKey:@"title"] length] > 0) { cell.textLabel.text = [photo objectForKey:@"title"]; } else if […]

需要关于调度队列,线程和NSRunLoop的一些说明

以下是我所知道和了解的内容: 全局队列是一个可以将任务分派给多个线程的并发队列。 执行任务的顺序不能保证。 例如: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { for (int i; i<10; i++) { doTask() } }) 如果我想调度到串行队列,我可以使用 dispatch_async(dispatch_queue_create("my.serial.queue", nil) { … } 每次只有一个任务被调度到一个线程并被执行。 订单是先进先出。 =====我感到困惑和不完全理解======= 主线程有一个NSRunLoop,在主线程中循环任务。 我想知道调度队列和运行循环之间的关系是什么? 我可以理解,如果调度一个任务到主线程,主线程的NSRunLoop得到调度任务并执行它? 把任务分派给多个线程的全局队列呢? iOS / OSX系统不仅自动创build线程,还为每个线程创buildNSRunLoop? 然后每个线程的运行循环从全局队列中获取调度的任务并执行它? 谁知道线程? dispatch_async()和dispatch_sync()函数知道哪个线程调度任务,或者队列知道哪个线程调度任务? 有没有办法从程序调度队列中获取线程的NSRunLoop对象(调度任务)? (这个问题与问题3有关)

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

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

将parameter passing给dispatch_async

我是新来的Swift,看看dispatch_async函数是如何工作的。 API文档显示具有两个参数的dispatch_async。 不过,我可以通过一个论点,没关系。 dispatch_async(dispatch_get_main_queue()) { } 我怎么不需要通过两个论点? 谢谢, API文件: