Tag: multithreading

Objective-C:线程中的服务器请求(如Android中的AsyncTask)

我想启动一个服务器请求,你可以取消。 我的想法是在一个线程中启动请求,以便用户界面不会冻结。 所以你可以通过点击“取消”button来杀死包括请求在内的整个线程。 使用Android它的工作原理:服务器请求在“AsyncTask”和“onReturn()”方法中开始,只要服务器请求完成,我可以立即做出反应。 我如何在iOS上使用Objective-C来实现这个function? 我第一次尝试是“NSInvocationOperation”。 您可以取消该操作,但是当请求完成并且结果可用时很难处理。 我认为NSInvocationOperation不是我的问题的解决scheme。 你会推荐给我吗? NSThread是我的正确select吗? 非常感谢你!

在Xamarin.iOS中检测你进入/离开主线程的时间

在Xamarin / MonoTouch中有没有办法检测代码是否在主线程中被调用? 我正在寻找类似于Java的EventQueue.isEventDispatchThread() – 我在Swing编程中发现它可以方便地assert (或者有时assert它不是) – 确保模型是持续更新并从EDT中读取,长时间运行的调用不会阻止用户界面。 我想在我的MonoTouch应用程序中做同样的事情,以确保各种代码不会从UI中调用,或者包装在InvokeOnMainThread 。 更新:对于后来的人来说: Obj-C来自JP下面的答案。 Xamarin / MonoTouch等价物是NSThread.Current.IsMainThread 。

UITableView insertRowsAtIndexPaths:WithRowAnimation不冻结用户界面

我试图了解什么是最好的做法,当我使用UITableView与大量的行插入时,表是可见的。 这是我的行为: 我有一个UITableView和一个线程,试图插入一个数据到这个表中。 我认为做一个[UITableView reloadData]是性能方面的一个糟糕的解决scheme,我知道UIKit操作是在主线程进行,因此,当数据源更新完成时,我试图发送一个NSNotification使UITableView更新操作(beginUpdate – insertRowAtIndex – endUpdate)在主线程上,但是这种技术冻结了用户界面。 我必须使用1000+以上的行数。 有人已经解决了这个问题? 是否可以使用GDCasynchronous和同步? 如果是的话,怎么样? 提前致谢。

如何从iPhone中的文档目录中读取pdf文件?

目前我在iPhone应用程序工作,我有一个pdf文件在资源文件夹(本地pdf文件),然后我读了pdf文件(paper.pdf)成功,下面我提到读本地pdf文件供您参考。 例: CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("paper.pdf"), NULL, NULL); pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); CFRelease(pdfURL); 然后我试图将pdf文件(从URL)存储在NSDocument目录中,成功存储。 NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.msy.com.au/Parts/PARTS.pdf"]]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myPDF11.pdf"]; [pdfData writeToFile:filePath atomically:YES]; 然后我试图读取该pdf文件(从NSDocument目录),但我不知道,请帮助我。 提前致谢

使用单个共享后台线程进行iOS数据处理?

我有一个应用程序,我正在从networking上下载一些资源,并对每一个进行一些处理。 我不希望这个工作在主线程上发生,但是它是非常轻量级和低优先级的,所以它们都可以在同一个共享工作线程上发生。 这似乎是一件好事,因为需要设置和拆除所有这些工作线程(这些线程都不会很长,等等)。 令人惊讶的是,似乎没有一种简单的方法可以让所有这些工作都在一个共享的线程上进行,而不是为每个任务产生一个新的线程。 实现并发的途径多年来似乎已经出现,这很复杂。 (显式NSThreads , NSOperationQueue ,GCD等) 我是否高估了产生所有这些线程的开销? 我应该只是没有汗水,并使用更容易的每个任务的方法? 使用GCD,并假定它比我更聪明的线程(重新)使用?

在后台线程上search

我试图在我的iPhone应用程序中search几千个对象,但search滞后很多 – 在每次击键之后,UI冻结1-2秒。 为了防止这种情况,我必须在后台线程上执行search。 我想知道是否有人在后台线程上search一些技巧? 我在NSOperation读了一下,search了网页,但没有find有用的东西。

NSMutableArray集合和@Synchronized块

在Objective C中,我使用来自各种线程的NSMutableArray实例,并使用@synchronized使其线程安全。 目前我对这个数组的所有访问都被一个@synchronized块,甚至objectAtIndex:方法保护着。 不过,我想知道哪些方法真的需要用@synchronized来保护。 我需要保护读取权限吗? 如果'ObjectAtIndex'没有被保护,并且与'removeObject'同时被调用,会发生什么? 如果所有的方法都受@synchronized保护,性能怎么样? (我写一个tcp / udp游戏服务器,真的不想过度保护这些数组,如果它会减less性能或产生锁)。 例如,我想'containsObject:'方法将枚举find该对象,我应该避免在另一个线程中的'removeObject:'contifnt调用。 也许一个好的解决办法是有太多不同的锁(读写访问)… 帮助和build议,欢迎! 非常感谢。 请在下面find示例代码来说明: @interface TestClass : NSObject { NSMutableArray * array; } @end @implementation TestClass – (id)init { self = [super init]; if (self) { array = [NSMutableArray array]; } return self; } -(id)objectAtIndex:(NSUInteger)index { @synchronized(array) **// IS IT USEFUL OR NOT ??** […]

UIScrollView滚动事件块UIViewanimation

我有一个UIImageView的animation设置,代表一个当前的值,并不断地继续滴答下去…理想情况下永远不会停止,在视图中也是一个scrollView或者当我滚动或放大scrollView时,animation停止,当scrollView完全停止移动时再次启动。 我相信这是由于线程的问题,因为重绘元素都发生在主线程,首先我试图UIViewanimation,然后甚至核心animation没有影响…有没有办法让我的蛋糕,吃呢? 任何和所有的帮助,将不胜感激 代码如下 – (void)TestJackpotAtRate:(double)rateOfchange { double roc = rateOfchange; for (int i = 0; i < [_jackPotDigits count]; ++i) { roc = rateOfchange/(pow(10, i)); UIImageView *jackpotDigit = [_jackPotDigits objectAtIndex:i]; float foreveryNseconds = 1/roc; NSDictionary *dict = @{@"interval" : [NSNumber numberWithFloat:foreveryNseconds], @"jackPotDigit" : jackpotDigit }; [NSTimer scheduledTimerWithTimeInterval:foreveryNseconds target:self selector:@selector(AscendDigit:) userInfo:dict repeats:YES]; } } -(void)AscendDigit:(NSTimer*)timer […]

multithreading:只有在完成执行其他方法后才执行方法调用

我试图按照要求asynchronous处理方法,一旦第一个方法完成,只有第二个方法应该开始执行。 问题是第一个方法本身具有在后台线程上运行的代码。 我试过dispatch_semaphore_wait,但也没有工作。 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ [self firstMethod]; NSLog(@"firstMethod Done"); }); dispatch_group_notify(group, queue, ^ { NSLog(@"1st method completed"); NSLog(@"2nd method starting"); [self secondMethod]; }); FirstMethod本身就像这样在另一个工作线程上运行 -(void)firstMethod { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ //processing here….. }]; 什么是最好的方法来实现它,我不能改变一些第三方提供的firstMethod的定义,也改变它意味着改变这个方法被调用的地方现有的代码很多

@synchronized与NSLock实例与pthread_mutex_t

我正在看多(2岁)的multithreading教程video,说这个 NSLock实例比使用@synchronized快3倍 pthread_mutex_t比NSLock实例快2倍(比@synchronized快6倍) 这是真的? 我还没有发现任何有权威的说,但是我只是想通过StackOverflow调查一些你的意见,也许是有力的证据。 谢谢! 虽然我已经接受了正确的答案,但这个问题的未来观察者会发现这篇文章是有帮助的: http : //perpendiculo.us/?p=133