Tag: multithreading

NSTimer,NSTask,NSThread和NSRunloop之间的基本区别是什么?

NSTimer , NSTask , NSThread和NSRunloop之间有什么区别,有什么时候使用它们的指导原则?

块执行后返回null的variables

我正在调度一个队列,在一个单独的线程(在viewWillAppear)下载一些flickr照片。 当我在块内logging数组的内容时,它完美地显示了一切: dispatch_queue_t photoDowonload=dispatch_queue_create("photoDownload", NULL); dispatch_async(photoDowonload, ^{ NSArray *photoList=[FlickrFetcher topPlaces]; //downloads flickr data self.listOfCities=photoList; NSLog(@"inside block: %@", self.listOfCities); //shows contents }); 但是当我尝试logging在块外部的块内设置的数组时,它将返回null。 dispatch_queue_t photoDowonload=dispatch_queue_create("photoDownload", NULL); dispatch_async(photoDowonload, ^{ NSArray *photoList=[FlickrFetcher topPlaces]; self.listOfCities=photoList; }); NSLog(@"after block: %@", self.listOfCities); //returns null 这里有什么问题? self.listOfCities被设置为NSArray属性,所以一旦在块中设置,它应该可以在其外部访问。

GCD,NSThread和performSelector:onThread:问题

我试图debugging一些iOS崩溃日志,其中包含以下错误信息: ***终止应用程序由于未捕获的exception“NSDestinationInvalidException”,原因:'*** – [SomeClass performSelector:onThread:withObject:waitUntilDone:modes:]:目标线程退出时,等待执行 代码的相关部分是: – (void) runInvocationOnMyThread:(NSInvocation*)invocation { NSThread* currentThread = [NSThread currentThread]; if (currentThread != myThread) { //call over to the correct thread [self performSelector:@selector(runInvocationOnMyThread:) onThread:myThread withObject:invocation waitUntilDone:YES]; } else { //we're okay to invoke the target now [invocation invoke]; } } 这是类似于这里讨论的问题,除了我不想取消我的onThread:线程。 事实上,在我的情况下, onThread:被传递给应用程序主线程的引用,所以它不应该被终止,除非整个应用程序正在终止。 所以第一个问题是,错误消息中引用的“目标”线程是我传递给onThread: ,还是等待onThread:线程完成调用的线程? 我认为这是第二个选项,就好像主线程真的已经终止后台线程的崩溃是有点模糊无论如何。 考虑到这一点,并基于以下来自performSelector:onThread:…的参考文档的讨论performSelector:onThread:… : 特别注意事项 该方法向其当前上下文的runloop注册,并依赖于定期运行的runloop来正确执行。 […]

线程调用方法

我发现这个方法与后台线程一起工作。 我的问题是,我已经在包含多个方法的后台线程中运行了一个完整的进程。 第一个方法调用第二个,第二个调用一些数据并传递给第三个。 -(void)firstMethod dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ if(someCondition == 0) { [self secondMethod:myArray]; } } dispatch_async(dispatch_get_main_queue(), ^(void){ [self.navigationController popViewControllerAnimated:YES]; }); }); } -(void)secondMethod:(NSArray *)array { a= a+3; [self thirdMethod:array[a]; } 所以你的总体思路是正确的? 所以我必须把第二个和第三个方法的function放在后台线程中吗? 或者整个过程如何进行?

PerformSelector不工作

MyThreadRun方法是这样调用MyMethod的 NSArray* args = [NSArray arrayWithObjects:arg1, target, NSStringFromSelector(mySelector), nil]; NSThread* mythread= [[[NSThread alloc] initWithTarget:self selector: @selector(MyThreadRun:) object:args] autorelease]; [MyThreadRun start]; 在MyThreadRun的最后,我尝试在调用MyMethod的类中调用一个函数来初始化线程,如下所示: NSObject* callbackTarget = [args objectAtIndex:1]; NSString* selector = [args objectAtIndex:2]; [callbackTarget performSelector:NSSelectorFromString(selector) withObject:calculationResult afterDelay:0]; 我在select器指向的方法上有一个断点,并且它从来没有命中。 如果我硬编码的方法名称,像这样 [callbackTarget updateWithResult:calculationResult] 它工作正常。 有什么我需要知道关于performSelector?

dataWithContentsOfURL,线程,与dataTaskWithURL – 有什么区别?

我们正在使用dataWithContentsOfURL,因为它,呃,简单… NSData *datRaw = [NSData dataWithContentsOfURL:ur]; 现在,当然,这将挂起主要的UI线程。 所以我们把它放在另一个线程。 我们这样做, -(void)performSearch:(NSString *)stuff then:(void(^)(void))after { dispatch_queue_t otherThread =dispatch_queue_create(nil,0); dispatch_queue_t mainThread =dispatch_get_main_queue(); dispatch_async(otherThread, ^{ self.resultsRA = [self … calls dataWithContentsOfURL …]; dispatch_async(mainThread, ^{ if (after) after(); }); }); } (顺便说一句,这是一个很好的介绍,如果需要https://stackoverflow.com/a/7291056/294884 ) 那么现在,苹果说,你不应该使用 dataWithContentsOfURL,他们说你应该改为使用NSSession ..所以, dataTaskWithURL:completionHandler: 我的问题, 是否有任何不同之处 ,使自己的线程(即dataWithContentsOfURL)与使用dataTask? 我们错误地使用 dataWithContentsOfURL:在一个线程,出于某种原因? PS我很欣赏这是更方便等我的意思是有真正的区别,任何危险,等谢谢!

如何在iOS中asynchronous下载多个图像,而不影响UI?

我有100个url,我想下载所有这些图像并保存在文档中。 为了节省我已经做了,也可以做懒加载,但我无法用最less的时间下载所有的graphics用户界面不应该挂起。 这样做有什么合适的方法? 谢谢

如何在asynchronous块内为dispatch_group_async调度dispatch_group_wait

我有这样的代码: [SVProgressHUD show]; [imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, …) { dispatch_group_async(queueGroup, queue, ^{ // Do stuff }); }]; dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER); [SVProgressHUD dismiss]; 基本上,显示加载animationHUD,并开始从资产生成图像缩略图,然后一旦隐藏HUD。 我正在使用一个调度组,因为我想确保在隐藏HUD之前生成所有的缩略图。 但是当我运行它时,HUD立即被解雇。 我猜这是因为generateCGImagesAsynchronouslyForTimes: completionHandler:的asynchronous性质generateCGImagesAsynchronouslyForTimes: completionHandler: – dispatch_group_wait在completionHandler中的第一个dispatch_group_async之前被调用。 解决这种情况的优雅方法是什么? 谢谢。

跨线程事件信号(Obj-C)的同步/等待devise?

在Cocoa应用程序中,我有这样的设置: 主线程(M)可以向某个后台“生产者”线程(B)提交请求,以完成一些工作,比如计算X项目的结果。 此后不久,不同的后台线程(C)可能需要计算项目X的结果,并且同时要求这些结果。 线程C可以自己重新同步工作,但是如果线程B恰好在计算项X的中间,我想要线程C阻塞并从B得到结果。计算的结果是可以find的磁盘,所以数据传递不是问题。 在线程B完成项目X之前,阻塞线程C的最好方法是什么? 注意那里的B进程是任意的–X只是这个例子中很多项目中的一个。 我想要阻止,直到具体项目X完成。 所以从概念上讲,我想要的是当线程B开始说“我在X上工作”时,设置某种标志的方法,如果C进来看到那个标志,就等待标志清除,然后得到结果。 不知道我是否可以将NSLockslocking在这个angular色中,或者如果操作系统中有一个更好的基元。 任何想法(或潜在的重构问题)欢迎! 谢谢。

如何使用设置自动释放池

您好我正在使用[NSThread detachNewThreadSelector:toTarget:withObject:]我得到了很多的内存泄漏,因为我没有autorelease池设置分离的线程。 我只是想知道我在哪里做这个? 是我打电话之前吗? [NSThread detachNewThreadSelector:toTarget:withObject:] 或者在正在另一个线程中运行的方法中? 任何帮助将不胜感激,一些示例代码将是伟大的。 谢谢。