Tag: 大中央调度

核心数据和GCD:将正确的托pipe对象上下文传递给自定义NSManagedObjects

我得到了运行时错误,这似乎是由于我的自定义NSManagedObjects与GCD不正确实现有关。 嵌套在GCD调用中,我使用的自定义NSManagedObjects(似乎)有自己的托pipe对象上下文(= self.managedObjectContext )。 我使用UIManagedDocument : self.managedDocument.managedObjectContext提供的托pipe对象上下文在应用程序委托中创build托pipe对象上下文。 我不明白如何将正确的托pipe对象上下文传递给我的自定义NSManagedObjects。 我将如何更改我的代码以使用正确的托pipe对象上下文? 这是我的主要方法(在​​视图控制器内): dispatch_queue_t queue; queue = dispatch_queue_create("queue", NULL); dispatch_async(queue, ^{ // … NSDecimalNumber *value = [reportedPeriod valueForCoa:figure.code convertedTo:self.currencySymbol]; // …}); } 在这个主要的方法中,我没有任何对托pipe对象上下文的引用,我只是调用valueForCoa:convertedTo:它编码如下): – (NSDecimalNumber*)valueForCoa:(NSString*)coaStr convertedTo:(NSString*)targetCurrencyStr { // … CoaMap *coa = [CoaMap coaItemForString:coaStr inManagedObjectContext:self.managedObjectContext]; // … } valueForCoa是我的自定义子类NSManagedObject ReportedPeriod一个方法,并使用它的(默认)托pipe对象上下文self.managedObjectContext 。 然后,应用程序通常会在执行获取请求时,在下面的方法中在自定义子类NSManagedObject CoaMap中崩溃: + (CoaMap*)coaItemForString:(NSString*)coaStr inManagedObjectContext:(NSManagedObjectContext*)context { NSFetchRequest […]

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的定义,也改变它意味着改变这个方法被调用的地方现有的代码很多

如何包装一个asynchronous方法,它将一个块转换为同步的目标c

我想包装一个看起来像这样的asynchronousAPI: [someObject completeTaskWithCompletionHandler:^(NSString *result) { }]; 转换成我可以这样调用的同步方法 NSString *result = [someObject completeTaskSynchronously]; 我该怎么做呢? 我做了一些文档阅读和谷歌search,并尝试使用“dispatch_semaphore”来尝试实现它像这样: -(NSString *) completeTaskSynchronously { __block NSString *returnResult; self.semaphore = dispatch_semaphore_create(0); [self completeTaskWithCompletionHandler:^(NSString *result) { resultResult = result; dispatch_semaphore_signal(self.semaphore); }]; dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER); return resultResult; } 但这似乎没有工作,它基本上只是停在dispatch_semaphore_wait。 执行永远不会到达_signal的内部块。 任何人都有代码示例如何做到这一点? 我怀疑该块必须在主线程以外的其他线程? 另外,假设我没有访问async方法背后的源代码。 谢谢!

苹果文档的GCD生产者 – 消费者解决scheme错误?

在Apple的“并发编程指南”的“从线程迁移”一节中,有 改变生产者 – 消费者实现 ,它宣称使用GCD可以简化典型的多步骤线程互斥+条件variables实现。 通过调度队列,可以将生产者和消费者实现简化为一个调用: dispatch_async(queue, ^{ // Process a work item. }); 当您的生产者完成工作时,所要做的就是将该工作添加到队列中,让队列处理该项目。 生产者 – 消费者问题也被称为有界缓冲区问题,但是上面没有提到缓冲区,其边界或消费者,更不用说阻止生产者和消费者,以避免过度/不足的运行。 这怎么可能是一个有效的解决scheme?

如何将代码块分派到iOS中的同一线程?

问题的主要方面:关于iOS。 我可以以某种方式派发代码块,他们将(a)在后台运行,(b)在同一个线程中运行? 我想在后台运行一些耗时的操作,但是这些操作必须在同一个线程上运行,因为它们涉及资源,不能在线程之间共享。 进一步的技术细节,如果需要的话:这是关于为Apache Cordova实现一个sqlite插件,这是一个移动平台上的HTML5应用程序的框架。 这个插件应该是Cordova的插件API中的WebSQL的一个实现。 (这意味着,不可能将整个事务包装在单个块中,这样可以使一切变得更容易)。 以下是Cordova文档中的一些代码: – (void)myPluginMethod:(CDVInvokedUrlCommand*)command { // Check command.arguments here. [self.commandDelegate runInBackground:^{ NSString* payload = nil; // Some blocking logic… CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload]; // The sendPluginResult method is thread-safe. [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; } 但据我所知,不能保证,那些派发的代码块(请参阅runInBackground )将在同一个线程上运行。

如果我嵌套dispatch_async调用会发生什么?

这可能是一个愚蠢的问题,但我需要为自己问清楚。 要将一个块提交到队列以供执行,请使用dispatch_sync和dispatch_async函数。 它们都以队列和块作为参数。 dispatch_async立即返回,asynchronous运行该块,而dispatch_sync阻塞执行,直到提供的块返回。 以下是一些情况: 情况1 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul); dispatch_async(queue, ^{ [self goDoSomethingLongAndInvolved]; dispatch_async(queue, ^{ NSLog(@"this is statement1"); }); }); 情况2 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul); dispatch_sync(queue, ^{ [self goDoSomethingLongAndInvolved]; dispatch_sync(queue, ^{ NSLog(@"this is statement1"); }); }); 情况3 { [super viewDidLoad]; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul); dispatch_async(queue, ^{ [self goDoSomethingLongAndInvolved]; dispatch_sync(queue, ^{ NSLog(@"this […]

核心数据保存对象在后台问题

我一直在尝试的是我正在使用一个后台队列来保存从Web服务拉到Core Data Sqlite3数据库的JSON对象。 保存发生在我通过GCD创build的序列化背景队列中,并保存到为该背景队列创build的NSManagedObjectContext的辅助实例中。 一旦保存完成,我需要用新创build/更新的对象更新主线程上的NSManagedObjectContext的实例。 我遇到的问题是主线程上的NSManagedObjectContext的实例无法find保存在后台上下文中的对象。 以下是我使用代码示例所采取的操作列表。 任何想法,我在做什么错了? 通过GCD创build一个后台队列,运行所有的预处理逻辑,然后保存该线程的后台上下文: 。 // process in the background queue dispatch_async(backgroundQueue, ^(void){ if (savedObjectIDs.count > 0) { [savedObjectIDs removeAllObjects]; } if (savedObjectClass) { savedObjectClass = nil; } // set the thead name NSThread *currentThread = [NSThread currentThread]; [currentThread setName:VS_CORE_DATA_MANAGER_BACKGROUND_THREAD_NAME]; // if there is not already a background context, then […]

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来正确执行。 […]

等待多部分图像发送完成

我正在iOS7中的一个应用程序,这是一种社交networking应用程序与图像的post和后端,保存所有客户端发送的数据。 iOS客户端通过json发送post信息,发送信息后,开始使用AFNetworking通过多部分forms发送图片。 我需要在图像发送时得到通知,以便我可以刷新应用程序的主视图,包括最近发布的新post。 在实践中,如果我要求后端的最后一个post,多部分还没有完成,图像的发送被中断,并不能发送图像。 后端是在WCF开发的,并且是一个RESTful JSON Web服务。 以下是将post发送到后端的方法: +(void)addPostToServerAddtext:(NSString *)text addimage:(UIImage *)image addbeach:(NSString *)beach location:(NSString*)location; { NSLog(@"entro a addPost"); NSString *urlBackend = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"URLBackend"]; NSData* dataImage = UIImageJPEGRepresentation(image, 1.0); NSString* ImageName = [NSString stringWithFormat:@"%@_%@.jpg",idUser ,dateToServer]; NSString *jsonRequest = [NSString stringWithFormat:@"{\"Date\":\"%@\"…."]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@newPost",urlBackend]]; NSMutableURLRequest *request = [ [NSMutableURLRequest alloc] initWithURL:url]; NSData […]

与GCD同时排队? (iOS 4.2.1)

Iam有问题: dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL); concurrentQueue在iOS 4.2.1(设备)上是nil ,但是相同的代码在运行iOS 5.0.1的另一个设备上完美工作。 当我检查标题说它从iOS 4.0可用,我做错了什么? 下面的代码从互联网上获取图像,并且在4.2.1之后的所有内容都很好,但是在4.2.1之后,任何想法是为什么呢? 你能用GCD创build一个并发队列吗? – (void)imageFromURL:(NSString*)link { if ([link length] == 0) return; dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL); if (concurrentQueue == nil) return; dispatch_async(concurrentQueue, ^{ __block UIImage* image = nil; dispatch_sync(concurrentQueue, ^{ NSError *error = nil; NSURL *url = [[NSURL alloc] initWithString:link]; NSURLRequest *request = […]