如何在目标 c 中使用 GCD dispatch_async 调用/编写以下方法

Posted

技术标签:

【中文标题】如何在目标 c 中使用 GCD dispatch_async 调用/编写以下方法【英文标题】:How call / write the following method using GCD dispatch_async in objective c 【发布时间】:2017-06-23 10:09:21 【问题描述】:

由于某些原因来修复一些崩溃,我需要在 GCD 中编写/调用以下方法,但由于它具有返回类型 NSArray,此处调度块不允许在调度块中编写此方法。

由于未捕获的异常“NSGenericException”,实际崩溃是正在终止应用程序,原因:“*** Collection <__nscfset:> 在枚举时发生了变异。”

有人可以帮我解决这个问题吗

-(NSArray*)getManagedObjectsArrayForEntity:(NSString*)entityName 
                               sortByFields:(NSArray*)sortByFields 
                                  predicate:(NSPredicate*)predicate
                                  ascending:(BOOL)ascending 



    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];
    [fetchRequest setFetchLimit:-1];

    // Set the sort descriptor
    if (sortByFields) 
        NSMutableArray *sortDescriptors = [NSMutableArray array];
        for (NSString *sortByField in sortByFields) 
            NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortByField ascending:ascending];
            [sortDescriptors addObject:sortDescriptor];
            [sortDescriptor release];
        
        [fetchRequest setSortDescriptors:sortDescriptors];
    

    if (predicate) 
        [fetchRequest setPredicate:predicate];
        //DDLogVerbose(@"Predicate: %@", [predicate description]);
    




NSLog(@"HAS CHANGES %d",self.managedObjectContext.hasChanges);

    NSError *error;
    //===
    return [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];


【问题讨论】:

如果你想异步调度块,你需要提供一个完成处理块,以便在操作完成后调用。 你能详细说明@Paulw11 您如何确定异步执行此方法将在枚举崩溃时解决您的变异问题?一般来说,引入并发不太可能有助于解决这种崩溃,实际上它可能会使其更难解决。为什么你认为这种方法是导致你崩溃的原因?让人们能够帮助您编辑您的问题以包括这些答案以及您认为可能相关的任何其他内容。 HTH 【参考方案1】:
dispatch_async(dispatch_get_main_queue(), ^
    //write your method body here
);

【讨论】:

谢谢@V-Dev,但我收到此错误,因为我有 NSArray 返回类型不兼容的块指针类型发送 'NSArray *(^)(NSURLResponse *__strong, NSData *__strong, NSError *__strong) ' 类型为 'void (^ _Nonnull)(NSURLResponse * _Nullable __strong, NSData * _Nullable __strong, NSError * _Nullable __strong)'的参数。 尝试使用调用某些方法返回数组,或者如果问题与返回数据有关,通知中心不要返回这里。您可以通过通知中心获取您的阵列尝试这一技巧。【参考方案2】:

试试

-(void)getManagedObjectsArrayForEntity:(NSString*)entityName 
                               sortByFields:(NSArray*)sortByFields 
                                  predicate:(NSPredicate*)predicate
                                  ascending:(BOOL)ascending 

//your code here

//at last [nsnotification center code here]


【讨论】:

以上是关于如何在目标 c 中使用 GCD dispatch_async 调用/编写以下方法的主要内容,如果未能解决你的问题,请参考以下文章

GCD中使用dispatch_after函数延迟处理任务

OC 线程操作 - GCD队列组

在 Objective-C 中使用 GCD 的 dispatch_once 创建单例

使用GCD创建倒计时

使用GCD验证码倒计时

iOS开发GCD的简单使用