Tag: 中央调度

使用dispatch_async在Swift中同时分析一个数组

我正尝试使用GCD的后台线程同时分析照片。 这是我写的代码: dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_UTILITY.value), 0)) { for (var i = 0; i < 8; i++) { let color = self.photoAnalyzer.analyzeColors(imageStrips[i]) colorList.append(color) } } 为了澄清variables名称,下面是它们的描述: photoAnalyzer是我写的一个名为Analyzer的类的一个实例,它包含处理图像的所有方法。 analyzeColors是Analyzer类中的一个方法,它执行大部分分析,并返回一个string,其中传入的图像的主色 imageStrips是构成原始图像部分的UIImage数组 colorList是一个string数组,用于存储图像每个部分的analyzeColor方法的返回值。 上面的代码依次运行,因为for循环一次只能从imageList访问一个图像。 我试图做的是同时分析imageStrips每个图像,但我不知道该怎么做。 任何build议将不胜感激。 如果你想看到所有的代码来进一步帮助我,我可以发布一个GitHub链接到它。 编辑这是我更新的代码来同时处理8个处理器。 dispatch_apply(8, imageQueue) { numStrips -> Void in let color = self.photoAnalyzer.analyzeColors(imageStrips[numStrips]) colorList.append(color) } 但是,如果我尝试使用超过8个代码,实际上运行速度比顺序执行要慢。

在Swift中的HTTP长轮询

我试图在iOS 8 +中使用Swift实现一个长轮询解决scheme。 虽然解决scheme无疑是有效的,并且让主线程自由地进行UI交互,但是内存使用量不断攀升,所以我显然做错了什么。 我写的课程如下: enum LongPollError:ErrorType{ case IncorrectlyFormattedUrl case HttpError } public class LongPollingRequest: NSObject { var GlobalUserInitiatedQueue: dispatch_queue_t { return dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0) } var GlobalBackgroundQueue: dispatch_queue_t { return dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.rawValue), 0) } var longPollDelegate: LongPollingDelegate var request: NSURLRequest? init(delegate:LongPollingDelegate){ longPollDelegate = delegate } public func poll(endpointUrl:String) throws -> Void{ let url = NSURL(string: endpointUrl) […]

iOS GCD:任何全局队列和具有后台优先级(DISPATCH_QUEUE_PRIORITY_BACKGROUND)之间的区别?

我正在阅读并发编程指南和东西混淆了我。 我看到很多代码调用以下任何后台任务: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 现在我所说的“背景”是stream行的意思: 除了主(UI)线程之外的任何地方执行的东西 因此,在文档之后,上面的语句返回具有不同优先级的任何非主线程队列。 我的问题是 – 为什么然后DISPATCH_QUEUE_PRIORITY_BACKGROUND存在? 最近我还看到许多使用DISPATCH_QUEUE_PRIORITY_BACKGROUNDasynchronous任务来执行后台任务。 DISPATCH_QUEUE_PRIORITY_DEFAULT , DISPATCH_QUEUE_PRIORITY_LOW或DISPATCH_QUEUE_PRIORITY_HIGH返回的队列是否与主线程相距甚远,如果使用dispatch_get_global_queue返回? 他们不是背景排队吗? 用DISPATCH_QUEUE_PRIORITY_BACKGROUND返回的队列有什么具体的用途? 我已经提到了这个,但是除了上面提到的stream行的含义之外,它没有多less澄清。 我相信我很迷茫的话 – 背景和背景排队。 如果有人可以解释(更好,graphics) – 将是一个很大的帮助。

重新加载具有图像的UICollectionViewCell

我正在尝试创build类似Facebook NewsFeed的东西,我正在使用自定义的UICollectionViewCell来显示来自JSON的数据(文本/图像)。 我有2个不同的API。 一个用于文本,另一个用于图像(每个单元格都没有图像)。 所以,首先,我从textAPI中获取所有文本值,并重新加载myCollectionView。 这是完美的。 现在的图像,我使用ImageFetcher来获取图像, func ImageFetcher(postId : NSNumber, completion : ((_ image: UIImage?) -> Void)!) { var image = UIImage() let urlString = "http://myImageAPI/Image/\(postId)" let jsonUrlString = URL(string: urlString) print(urlString) URLSession.shared.dataTask(with: jsonUrlString!) { (data, response, error) in do { if let jsonData = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any] { if […]

使用Grand Central Dispatch每天同一时间安排一项function

我已经阅读了这个答案,我不相信它有我在找什么,但我是一个初学者,我很高兴有人指出在这个链接的答案: dispatch_after – GCD在swift? 我的目标是:设置一个function,在用户的时区(或系统的时区)每天上午9点运行。 我已经非常简短地使用GCD来延迟一个函数,如下所示(它工作的很好): var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(10 * Double(NSEC_PER_SEC))) dispatch_after(dispatchTime, dispatch_get_main_queue(), { let alert = UIAlertView() alert.title = "Foo Alert" alert.message = "foo." alert.addButtonWithTitle("OK") alert.show() AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) }); 所以我想每天都按照上面提到的那样开火,但是我坚持的第一件事就是将DISPATCH_TIME_NOW换成时区相关值。 我是否甚至需要考虑时区,或者只是用军事09:00取代DISPATCH_TIME_NOW就足够了? 另外,关于总体目标的任何build议,每天同一时间调度发射function都将非常感激。 我也没有结婚使用GCD这个目标,但这是我遇到最多的search。

iOS GCD自定义并发队列执行顺序

根据苹果的文件,我对这个问题有疑问 并发并发队列(也称为全局调度队列)同时执行一个或多个任务, 但是任务仍然按照它们被添加到队列的顺序启动。 当前正在执行的任务在由调度队列pipe理的不同线程上运行。 在任何给定点执行的任务的确切数量是可变的,并取决于系统条件。 在iOS 5及更高版本中,您可以通过将DISPATCH_QUEUE_CONCURRENT指定为队列types来自己创build并发调度队列。 此外,还有四个预定义的全局并发队列供您的应用程序使用。 有关如何获取全局并发队列的更多信息,请参阅获取全局并发调度队列。 我做了一个testing,使用示例代码, dispatch_queue_t concurrentQueue; concurrentQueue = dispatch_queue_create("com.gcd.concurrentQueue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(concurrentQueue, ^{ NSLog(@"First job "); }); dispatch_async(concurrentQueue, ^{ NSLog(@"Second job"); }); dispatch_async(concurrentQueue, ^{ NSLog(@"Third job "); }); 但是结果似乎并不像它们被添加的顺序,这里是结果, 2015-06-03 18:36:38.114 GooglyPuff[58461:1110680] First job 2015-06-03 18:36:38.114 GooglyPuff[58461:1110682] Third job 2015-06-03 18:36:38.114 GooglyPuff[58461:1110679] Second job 所以我的问题是,不应该是第一,第二,第三? 欢迎任何build议,并感谢您的帮助。

Swift,dispatch_group_wait不等

我正在尝试使用大中央调度等待文件完成下载之前继续。 这个问题是从这个衍生出来的: Swift(iOS),等待所有图像在返回之前完成下载 。 我只是试图找出如何让dispatch_group_wait(或类似)实际上等待,而不是在下载完成之前继续。 请注意,如果我使用NSThread.sleepForTimeInterval而不是调用downloadImage,它会等待很好。 我错过了什么? class ImageDownloader { var updateResult = AdUpdateResult() private let fileManager = NSFileManager.defaultManager() private let imageDirectoryURL = NSURL(fileURLWithPath: Settings.adDirectory, isDirectory: true) private let group = dispatch_group_create() private let downloadQueue = dispatch_queue_create("com.acme.downloader", DISPATCH_QUEUE_SERIAL) func downloadImages(imageFilesOnServer: [AdFileInfo]) { dispatch_group_async(group, downloadQueue) { for serverFile in imageFilesOnServer { print("Start downloading \(serverFile.fileName)") //NSThread.sleepForTimeInterval(3) // […]

调度队列和asynchronousRNCryptor

这是在iOS上使用RNCryptorasynchronous解密大文件的后续步骤 我设法用本文描述的方法asynchronous解密一个大的,下载的文件(60Mb),Calman在他的回答中纠正了这个问题。 它基本上是这样的: int blockSize = 32 * 1024; NSInputStream *cryptedStream = [NSInputStream inputStreamWithFileAtPath:…]; NSOutputStream *decryptedStream = [NSOutputStream output…]; [cryptedStream open]; [decryptedStream open]; RNDecryptor *decryptor = [[RNDecryptor alloc] initWithPassword:@"blah" handler:^(RNCryptor *cryptor, NSData *data) { NSLog("Decryptor recevied %d bytes", data.length); [decryptedStream write:data.bytes maxLength:data.length]; if (cryptor.isFinished) { [decryptedStream close]; // call my delegate that I'm finished with […]

如何修改自定义GCD队列的优先级?

我创build了这样的GCD队列: dispatch_queue_t q = dispatch_queue_create("com.testcompany.myqueue", NULL); 当我将任务派送到该队列时,比在主线程上执行任务要慢。 dispatch_async(q, ^(void) { [self performHeavyCalculationAndUpdateUI]; }); 我怀疑这个队列的默认优先级很低。 我怎样才能改变这个队列的优先级? 还是有什么我必须做的?

在不同的线程上调用我的方法有哪些不同的方法?

我有一些数据计算方法(让它是“myMethod:”),我想移动到另一个线程的调用,因为我不想阻止我的主要用户界面function。 所以,开始做一些关于如何在另一个线程上调用我的方法的研究。 据我所知,目前有很多不同的方法来做到这一点。 这是一个列表: a)使用纯线程(可用于iOS 2.0): [NSThread detachNewThreadSelector:@selector(myMethod:) toTarget:self withObject:_myParamsArray]; b)使用简单的快捷方式(从iOS 2.0开始可用)。 可用于inheritance的NSObject,但该方法也属于NSThread类: [self performSelectorInBackground:@selector(myMethod:) withObject:_myParamsArray]; c)使用Grand Central Dispatch队列的新方法(从iOS 4.0开始): dispatch_async(dispatch_get_global_queue(0, 0), ^ { [self myMethod:_myParamsArray]; }); d)不知何故,使用一些类,如NSOperation,NSBlockOperation或NSOperationQueue,虽然不知道该怎么做(一些例子,将不胜感激) 目前,我曾经用过“b”这个案例,但是对这个利弊感兴趣,还有其他相关的build议。 更新:e)也发现了另一种执行类似线程的东西 – 运行循环 。 以下是苹果文档摘录: 运行循环是一个事件处理循环,用于安排工作和协调收到的事件。 运行循环的目的是在有工作要做的时候保持你的线程忙,当没有时候让线程进入睡眠状态。 恕我直言,或多或less你正在处理相同的任务 – 如何调用你的方法在单独的线程进行asynchronous操作。 更新2:已经有了NSInvocationOperation和NSOperationQueue和恕我直言的一些经验,这是相当方便的。 根据苹果文档,GCD和NSOperations是实现multithreading的首选方式。 而且,NSOperations从iOS 4.0开始运行在GCD上。 简而言之,你实例化NSIvocationOperation(作为你的方法的调用),然后实例化NSOperationQueue并将调用添加到队列中。 NSOperationQueue足够聪明,你可以将多个NSIvocationOperation对象(包装你的方法调用)和它们实例化到NSOperationQueue。 剩下的就放心了。 NSOperationQueue确定需要多less个并行线程来执行调用(NSInvocationOperation)并为您处理。 它可以在线程A上执行第一个调用,然后在线程B上执行第一个调用,在线程C上执行第三个,然后执行在线程B上,所以你不必担心这个问题。 但是,如果你想,你可以告诉NSOperationQueue最大的线程可以用来执行调用(例如1),但我没有这个需要。 默认情况下,所有的任务都是在主线程以外的地方执行的,所以操作队列默认是asynchronous的。 另外,如果你想在一个严格队列中执行你的方法调用(每个包装在单独的NSInvocationOperation中),那么你可以添加依赖关系,所以NSOperationQueue将保留方法调用顺序。 这是一个例子: // wrap your […]