Tag: 并发

核心数据保存崩溃

我有一个UITableView使用FetchedResultsController从CoreData中提取数据,并注册数据更新。 在第二个线程中,我从服务器下载数据并更新相同的数据( UITableView使用的数据)。 更新并不复杂,只是更新实体的BOOL字段。 当我调用对象上下文的保存,我得到这个exception: NSInternalInconsistencyException ,原因是 "Failed to process pending changes before save. The context is still dirty after 100 attempts. …" 如果我没有保存更新后的权利,但只有在应用程序即将终止时,应用程序运行良好, UITableView被正确更新和数据持久。 任何指针为什么可能会发生? 难道我做错了什么?

如何找出是什么导致IOS设备上的错误崩溃报告?

基督复活(复活节快乐)! 在小应用程序重构之后testing应用程序时,我收到了“Crashlytics”崩溃日志。 正在尝试更改模型以避免双重同步方法调用(同时)通过将所有下一个调用(从第二个调用开始)发送到专用串行队列。 我已经添加了下面的代码: @interface SynchronizationModel () @property (nonatomic) dispatch_queue_t synchronizationQueue; @end @implementation SynchronizationModel BOOL isSynchronizationNotCalled = YES; #pragma mark – Synchronization + (dispatch_queue_t)synchronizationQueue { static dispatch_queue_t queue; static dispatch_once_t onceToken; const char *queueID = "com.app.synchronizationModel.queue"; dispatch_once(&onceToken, ^{ queue = dispatch_queue_create(queueID, DISPATCH_QUEUE_SERIAL); }); return queue; } + (void)sychronizeOfflineObjects { if (isSynchronizationNotCalled) { NSLog(@"%d synchronization without […]

如果方法结束,只能继续循环

我有一个for/in循环,如下所示: for(NSString *paymentId in success){ [self getPaymentDetails:paymentId]; } getPaymentDetails方法是asynchronous的。 如果方法已经完成,我如何创build一个完成块来只继续for / in循环? 细节 getPaymentDetails方法如下所示: -(void)getPaymentDetails:(NSString *)paymentId{ PFUser *currentUser = [PFUser currentUser]; [PFCloud callFunctionInBackground:@"getpaymentdetails" withParameters:@{@"objectid": paymentId, @"userid": currentUser.objectId} block:^(NSDictionary *success, NSError *error) { if(success){ NSDictionary *payment = success; NSString *amount = [payment objectForKey:@"amount"]; if (![amount isKindOfClass:[NSNull class]]) { [self.amountArray addObject:amount]; } else { [self.amountArray addObject:@""]; } […]

如何在右侧队列上初始化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> { […]

线程安全:NSOperationQueue +

在使用操作队列时,找不到任何示例如何处理同一个(类)variables。 在C&线程关于互斥体。 那么,当NSOperationQueue启动一个线程的操作和类variables会发生什么变化呢? 线程安全吗? 谢谢。 @interface MyTest { NSMutableArray *_array; } @end -(id)init { … _array = [NSMutableArray new]; // class variable // queue time consuming loading NSOperationQueue *queue = [NSOperationQueue new]; NSInvocationOperation *operation = [NSInvocationOperation initWithTarget:self selector:@selector(populate) object:nil]; [queue addOperation:operation]; // start continuous processing [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(processing) userInfo:nil repeats:YES]; … } -(void)populate { […]

为什么Objective-C / Swift中的asynchronousnetworkingtesting困难?

所以,当我遇到以下情况时,我正在学习更多关于如何testingasynchronous代码的知识: 只要给定的testing方法完成,XCTest方法将考虑完成一个testing,并转到下一个testing。 这意味着在下一次testing运行时,来自以前testing的任何asynchronous代码将继续运行。 networking代码通常是asynchronous的,因为您不想在执行networking提取时阻止主线程。 再加上当testing方法结束时testing完成的事实,可能使testingnetworking代码变得困难。“ 不过,这在我看来是矛盾的。 如果我的理解正确,他说,即使asynchronous代码完成,XCTest方法也会继续运行。 然而,他接着说testing方法完成后testing就完成了。 但是这两个语句是矛盾的,由于asynchronous代码仍在运行,testing没有完成,而是在串行队列中继续执行下一个进程。 换句话说,当asynchronous代码完成时testing是否完成,还是在asynchronous代码仍在运行时继续testing? 最重要的是,networkingtesting如此困难? 谢谢。

如何确保OperationQueue中的操作一个接一个地完成

执行相互依赖的OperationQueue ,可以使用OperationQueue来确保以正确的顺序执行它们。 但是,也可以保证操作一个接一个地完成? 让我们假设一个执行asynchronous的方法,需要一些时间来完成: public func performOperation(_ number: Int, success: @escaping (Int) -> Void)->Void { DispatchQueue(label: "operations").async { print("Operation #\(number) starts") usleep(useconds_t(1000-number*200)) // Block thread for some time success(number) } } 操作和依赖关系创build如下: let operationQueue = OperationQueue.main for operationNumber in 0..<4 { // Create operations as an example let operation = BlockOperation(block: { performOperation(operationNumber) { number […]

dispatch_once过度杀伤了+ ?

如果我在+[NSObject initialize]里面创build一个单例,我需要把我的代码放在dispatch_once块里面吗? static NSObject * Bar; @implementation Foo + (void)initialize { if (self == [Foo class]) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Bar = [NSObject new]; }); } } @end 编辑 我很担心这一点,因为我想确保所有的线程都会在调用+[Foo initialize]之后看到我已经设置了Bar 。 文档说+[NSObject initialize]是线程安全的,但这是否意味着它是内存安全的?

在UITableView上执行GCD

当我创build单元格时,我正在进行一些繁重的计算。 我试图找出保持UITableViewstream体的最佳方式,但是在相同types的背景上进行计算(保持UI线程没有太多的处理)。 仅用于testing目的,我使用这个作为我繁重的计算方法: +(NSString*)bigCalculation { int finalValue=0; int j=0; int i=0; for (i=0; i<1000; i++) { for (j=0; j<10000000; j++) { j++; } finalValue+=j/100*i; } return [NSString stringWithFormat:@"%d",finalValue]; } 在cellForRowAtIndexPath里面,我只做下面的事情: – (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *identifier=@"identifier"; UITableViewCell *cell=nil; cell=[aTableView dequeueReusableCellWithIdentifier:identifier]; if(!cell) { cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; } NSString *text=[dataSource objectForKey:[[dataSource allKeys] objectAtIndex:indexPath.row]]; […]

不同线程(主/专用队列)中的pipe理对象上下文是否可以处理相同的对象?

我有主队列 ( AppDelegate中提供的默认上下文) NSManagedObjectContext ,并创build另一个NSManagedObjectContext 私人队列中请求数据更新到Web服务。 我使用主要上下文来获取所有对象在整个应用程序中显示和pipe理,我使用私有上下文来插入我从服务接收到的新对象,以避免阻塞用户界面,并避免与对象的“干扰”在用户和/或应用程序与他们一起操作的情况下的主要背景。 这两种情况是“兄弟姐妹”,他们不是父母和孩子。 这是因为我需要创build所有新的对象,以便后来知道是否应该删除它们中的一些(对象的属性指示)。 重点是,我有重复的对象集合,一个在主要上下文中,另一个在私有上下文中。 他们应该有不同的对象ID,但根据我的应用程序的逻辑,他们是“相同”的对象。 如果我在主要上下文中有一个objectA ,并且在私有上下文中接收到相同的objectA ,但是具有更新的值,则需要在private上下文objectAreplace为objectA 。 但是他们理论上有不同的objectID 。 我的问题是: 我可以在主要上下文中searchobjectA ,从那里删除它,并使用objectWithID将objectA从私有上下文“转移”到main? 考虑到主要内容在主队列中,而私人队列在私人队列中。 相反,我应该从主要上下文中删除objectA ,然后保存私有上下文,然后再从主要上下文中获取objectA ? 也许我应该以另一种方式处理这种情况… 提前致谢