Tag: multithreading

如何在右侧队列上初始化ManagedObjectContext?

非常需要一个build议,目前用完了想法。 我堆栈与核心数据并发相关的问题,debugging我使用 – “com.apple.CoreData.ConcurrencyDebug”和我有: 堆栈: 线程3队列:coredata(serial) 0 + [NSManagedObjectContext Multithreading_Violation_AllThatIsLeftToUsIsHonor ]:CoreData`- [NSManagedObjectContext executeFetchRequest:error:]: 1 – [NSManagedObjectContext executeFetchRequest:error:]: 2 NSManagedObjectContext.fetch(__ObjC.NSFetchRequest)抛出 – > Swift.Array: 3(AppRelegate。)(fetchRequest NSFetchRequest) – > [A])。(closure#1) 我从这里进入AppDelegate :: fetchRequest: let messageRequest: NSFetchRequest<ZMessage> = ZMessage.fetchRequest(); messageRequest.sortDescriptors = [NSSortDescriptor(key: "id", ascending: false)]; let messageArray: Array<ZMessage> = self.fetchRequest(messageRequest); 我在串行队列(self.queueContainer)上执行所有coredata的东西。 public func fetchRequest<T>(_ request: NSFetchRequest<T>) -> Array<T> { […]

iOS7:UIImageView永远出现

我有一个使用GCD创build和插入视图的UIView 。 它在iOS7上工作,但UIImageView永远显示。 这是我正在使用的示例代码。 UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 120)]; for (int i = 0; i < 200; i++) { UIView *view = [[UIView alloc] initWithFrame:CGRectMake(77 * i, 0, 77, 88)]; [scrollView addSubview:view]; dispatch_queue_t queue = dispatch_queue_create("image", NULL); dispatch_async(queue, ^{ UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"photo@hd.png"]]; imageView.frame = CGRectMake(0, 0, 77, […]

如何在没有达到全球GCD限制的情况下并行执行许多(100+)任务?

问题是 : 当在后台中延迟加载100个图标列表时,我点击了GCD线程限制(64个线程),这导致我的应用程序在主线程上通过semaphore_wait_trap冻结。 我想重构我的线程代码,以防止这种情况发生,同时仍然加载图标asynchronous,以防止UI阻塞。 背景 : 我的应用程序加载了一个SVG图标的屏幕。 金额平均从10-200不等。 通过使用本地SVG图像或远程SVG图像(如果它具有自定义图标)绘制图标,然后对它们进行后处理以获得最终的图像结果。 因为这需要一些时间,而且对用户来说不是至关重要的,所以我想在后台加载和后处理它们,所以它们会随着时间的推移而popup。 对于每个图标我使用以下内容: dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(concurrentQueue, ^{ //code to be executed in the background SVGKImage *iconImage = [Settings getIconImage:location]; dispatch_async(dispatch_get_main_queue(), ^{ //code to be executed on the main thread when background task is finished if (iconImage) { [iconImgView setImage:iconImage.UIImage]; } }); }); getIconImage方法处理基本SVG的初始加载,如果它是本地的,它将与[NSInputStream inputStreamWithFileAtPath:path]同步读取,如果它应该远程加载, […]

multithreading违反核心数据

我有一个应用程序,我在启动时使用操作列表下载数据,并随机崩溃,因为未知的核心数据原因,所以我花了几天的时间检查最佳实践,以使用MagicalRecord更新/获取multithreading核心数据中的数据。 其中一个选项是启用multithreadingdebugging器-com.apple.CoreData.ConcurrencyDebug 1 ,其中Xcode在违反其规则之一时停止应用程序。 所以,Xcode停止我的应用程序在这一行[SyncRequestEntity MR_createEntityInContext:[self getPrivateContext]] + (MagicalRecordVersionNumber) version { return MagicalRecordVersionNumber2_3; } @implementation NSManagedObjectContext (MagicalRecord) + (NSManagedObjectContext *) MR_context { return [self MR_contextWithParent:[self MR_rootSavingContext]]; } + (NSManagedObjectContext *) MR_contextWithParent:(NSManagedObjectContext *)parentContext { NSManagedObjectContext *context = [self MR_newPrivateQueueContext]; [context setParentContext:parentContext]; [context MR_obtainPermanentIDsBeforeSaving]; return context; } – (void) MR_obtainPermanentIDsBeforeSaving { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MR_contextWillSave:) name:NSManagedObjectContextWillSaveNotification object:self]; […]

后台线程中的SIGSEGV NSRunLoop runMode:beforeDate:

我正在使用以下模式的后台线程: // Defined in .h-file as ivar BOOL backgroundThreadIsAlive; // .m file static NSThread *backgroundThread = nil; – (id)init { if (self = [super init]) { if (backgroundThread == nil) { backgroundThreadIsAlive = YES; backgroundThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadMain:) object:nil]; [backgroundThread start]; } } return self; } – (void)threadMain:(id)data { NSRunLoop *runloop = [NSRunLoop […]

当应用程序在后台模式下工作时,CoreData错误/exception

我正在做一个multithreading的CoreBluetooth应用程序,其中iPhone正在作为一个中央,扫描(基于UI交互)的外设,然后连接和处理,导致应用程序的CoreData模型的各种更改,用于存储用户可以访问的不同外设的状态(而不必在用户每次启动应用程序时连接到它们)。 用户基本上通过UI请求与外围设备的连接,然后UI发起asynchronous工作者线程,尝试在特定的时间范围内(例如几分钟)完成请求,否则向UI报告失败/超时。 一切工作正常,但我现在刚开始添加对后台执行的支持,因为用户很可能会启动asynchronous工作线程,开始扫描BLE外设,然后locking手机并放在口袋里,当外围设备到达时,期待事物发挥作用。 然而,蓝牙智能的东西,他们应该(外设发现,连接和处理),但我突然得到的CoreDataexception; CoreData: error: exception during newFetchedPKsForSourceID: I/O error for database at /var/mobile/Applications/8640B48D-8744-436A-A083-C39F63FBFB3F/Documents/Model.sqlite. SQLite error code:266, 'not an error' errno:1 with userInfo of { NSFilePath = "/var/mobile/Applications/8640B48D-8744-436A-A083-C39F63FBFB3F/Documents/Model.sqlite"; NSPOSIXErrorDomain = 1; NSSQLiteErrorDomain = 266; } CoreData: error: exception during newFetchedPKsForSourceID: authorization denied with userInfo of { NSFilePath = "/var/mobile/Applications/8640B48D-8744-436A-A083-C39F63FBFB3F/Documents/Model.sqlite"; NSSQLiteErrorDomain = 23; } CoreData: […]

对于在主线程的appDelegate managedObjectContext中创build的对象,“核心数据无法完成错误”

我错误地在后台线程上创build了一组对象,它创build了一个新的managedObjectContext,其中保存了对象。 这导致了许多“核心数据无法完成的错误”在我的现场应用程序崩溃。 请注意 – 我不是试图删除这些对象 – 这是一个问题,他们的创build方式,当我尝试在主线程上的应用程序委托(主)上下文中再次保存它们。 令人困惑的是我看到这个错误的其他对象,不同types的对象。 它们可以与在后台线程中创build的对象相关,尽pipe它们本身并不是在后台线程中创build的。 我很困惑这是怎么发生的。 我怎么能得到“核心数据不能履行过错”错误的对象不是在后台线程中创build,但应用程序委托(主)上下文? 有没有什么办法可以回到我的用户的实时应用程序中修复这个错误? 让我参考我的另一个问题,通过这个问题,我发现了这个错误: “核心数据不能满足一个错误”,没有被删除的对象 我写了一个新的问题,因为我觉得这是一个不同的问题 – 尽pipe绝对是相关的。 以下是在后台线程中创build对象的代码: – (void)friendPickerViewControllerDidChooseFriends:(NSArray *)friends { __ENTERING_METHOD__ if (friends.count > 0) { [[FacebookHelper sharedManager] friendPickerController].navigationController.navigationBar.userInteractionEnabled = NO; [self startProgressIndicator]; [self performSelectorInBackground:@selector(importFriends:) withObject:friends]; } else { [self dismissModalImportViewControllerAnimated];//releases picker delegates, etc } } #pragma mark – #pragma mark Import Friend […]

如何在添加子视图后立即在UI中显示子视图?

基本上我想要一个标签作为一个子视图出现,当我添加它,而不是等到当前线程完成它正在做什么。 在下面的例子中,标签出现在应用程序的UI中,同时打印“Awake”。 你知道如何让我的子视图出现在用户界面之前,睡眠线程? @IBAction func ButtonTapped(_ sender: Any) { let label = UILabel(frame: self.view.bounds) label.text = "Label Text" self.view.addSubview(label) // I want this to appear on the UI before… sleep(3) print("Awake") // … this is printed } 并且在DispatchQueue.main.async {}中包含addSubView()行不能解决问题。 谢谢。

UIActivityIndi​​catorView没有出现iOS 5

我正在尝试实现一个简单的微调,而我的应用程序从互联网上search数据。 我的数据抓取工作正常,但有时需要一段时间,所以我想使用UIActivityIndi​​catorView让用户知道应用程序没有崩溃。 但它目前不工作。 我从这些论坛和其他人那里尽可能地收集到,但由于某种原因,这是行不通的。 再一次,我觉得这个解决scheme可能非常简单。 这是我正在做的事情: 我在.h文件中声明微调为属性: @property (strong, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator; 我还使用故事板将一个微调对象拖到了viewcontroller上,并使用CTRL拖动创build了一个到该属性的连接。 触发URL请求的button(以及随后的数据加载和parsing)实际上触发了一个segue,所以我使用 – (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender function和任何事情都是一样的。 除了prepareforsegue函数之外,我没有附加到button的特定function。 (也许这是一个问题?它是否需要有一个IBAction关联?…) 无论如何,这个函数触发这个: [self GoAheadAndGetData]; 而这又开始如此: – (void)GoAheadAndGetData { [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil]; ……. etc 所以这个函数看起来像这样: – (void) threadStartAnimating:(id)data { [activityIndicator startAnimating]; } 最后,在GoAheadAndGetData函数的最后,我放置了停止animation调用,如下所示: [activityIndicator stopAnimating]; 明白了吗? 请让我知道如果有人需要更多的信息 – 我曾试图剥离到基本,所以我不必在这里发布吨代码… 提前谢谢 – 我真的很感激任何帮助,我可以得到。 我不太清楚为什么现在不行。

同步进程执行的同步

我有一些并行操作的数据处理。 在处理过程中,我需要检索该位置的反向地理编码。 据了解, – (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler还在后台线程中执行地理编码请求,并在调用后立即返回。 当地理编码完成请求时,它会在主线程上执行完成处理程序。 我怎样才能阻止我的并发操作,直到geocoder检索结果? __block CLPlacemark *_placemark – (NSDictionary *)performDataProcessingInCustomThread { NSMutableDictionary *dict = [NSMutableDictionary alloc] initWithCapacity:1]; // some operations CLLocation *location = [[CLLocation alloc] initWithLatitude:40.7 longitude:-74.0]; [self proceedReverseGeocoding:location]; // wait until the geocoder request completes if (_placemark) { [dict setValue:_placemark.addressDictionary forKey:@"AddressDictionary"]; return dict; } – (void)proceedReverseGeocoding:(CLLocation *)location { CLGeocoder […]