小编ink*_*002的帖子

GCD串行队列似乎不是串行执行的

我有一个方法,有时可以在我的代码中调用.下面是一个非常基本的示例,因为代码处理iphone照片库中的图像和文件,并在完成该方法时标记它们已经处理过.

@property (nonatomic, assign) dispatch_queue_t serialQueue;

....

-(void)processImages
{
    dispatch_async(self.serialQueue, ^{
        //block to process images
        NSLog(@"In processImages");

        ....

        NSLog(@"Done with processImages");
    });
}
Run Code Online (Sandbox Code Playgroud)

我认为每次调用此方法时我都会得到以下输出..."在processImages""使用processImages完成""在processImages""完成了processImages"等...

但我总是得到

"在processImages""在processImages""完成与processImages""完成与processImages"等...

我以为串口队列会等到第一个块完成,然后开始.对我来说,似乎它正在启动方法,然后它再次被调用并在第一个调用完成之前启动,创建通常不会被处理的图像的重复,因为如果它真的按顺序执行,则该方法将知道它们已经处理完毕.也许我对串行队列的理解并不具体.有什么输入?谢谢.

编辑:更多上下文,这是块中发生的事情...这可能导致问题???

@property (nonatomic, assign) dispatch_queue_t serialQueue;

....

-(void)processImages
{
    dispatch_async(self.serialQueue, ^{
        //library is a reference to ALAssetsLibrary object 

        [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop)
        {
            [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
            {
             ....
             //Process the photos here
            }];
        failureBlock:^(NSError *error) { NSLog(@"Error loading images from library");
        }];

    });
}

-(id)init
{
    self …
Run Code Online (Sandbox Code Playgroud)

queue grand-central-dispatch ios serial-processing

6
推荐指数
2
解决办法
4400
查看次数

魔法记录背景保存似乎阻止UI

我有一个NSOperation,我把它放入队列.NSOperation执行一些长时间的照片处理,然后将信息/元数据保存在该照片的核心数据中.在我的自定义NSOperation类的主要方法中,我执行下面的代码块

-(void)main
{
    //CODE ABOVE HANDLES PHOTO PROCESSING...
    //........

    //THEN I SAVE ALL DATA BELOW LIKE SO
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {

        Post *post = [Post createInContext:localContext];

        //set about 15 pieces of data, all strings and floats
        post.XXXX = XXXXX;
        post.DDDD = DDDDD;
        etc...
    } completion:^(BOOL success, NSError *error) {
        NSLog(@"Done saving");
    }];
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,即使只有3张照片保存它真的冻结我的用户界面.我本以为在NSOperation中执行这个我会没事的.

我应该补充一点,每个NSOperation处理一张照片,所以有时队列可以有5-10张照片,但我不认为这会有任何区别,即使只有三个像我说它冻结UI.

感谢您的帮助.

更新:------------ * --------------

我切换到2.2版本,但这似乎阻止了UI更多...现在我正在使用

-(void)main
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext    contextForCurrentThread];
    //CODE BELOW HANDLES PHOTO PROCESSING...
    //........

    //THEN I SAVE ALL DATA BELOW LIKE …
Run Code Online (Sandbox Code Playgroud)

core-data nsoperation ios magicalrecord

5
推荐指数
1
解决办法
2666
查看次数

Magical Record在单独的线程中创建/获取实体

我有一堆NSOperations需要在队列中运行时创建和获取实体.

  1. 在NSOperations中创建实体时,我可以简单地使用默认上下文创建,或者因为我在不在主线程上的新线程中是不允许/建议的?如果我在这个线程上创建一个新实体,那么将它合并回默认上下文然后(而不是保存到商店)的最佳方法是什么?

  2. 在获取这些线程时,我需要获取然后更新该实体中的数据.我不知道如何做到这一点然后合并到默认上下文.

或者,当您保存时,您获取/创建的线程真的无关紧要?

我说上面的默认上下文,因为我有NSFetchedResultsControllers监视更新和插入的默认上下文.目前我的解决方案是在主线程上完成所有这些工作,但是应用程序现在开始爬行,现在正在通过它运行大量数据.

我还有一个类监控(通过KVO)操作队列计数.一旦它变为零,我就预先形成一个保存.我宁愿只在完成所有上述NSOperations后执行,就像我现在正在执行的那样.感谢您的帮助.

core-data nsoperation nsmanagedobjectcontext ios magicalrecord

4
推荐指数
1
解决办法
1488
查看次数

NSOperation传回数据

我一直在搜索,但只能找到委托模式的想法来传递来自NSOperation的数据.我有一个NSOperation,在完成NSOperation后下载数据我希望它能够传递给将它下载的数据放入NSoperationQueue的类.在我的队列中最多可以有100个这样的NSOPerations,它们都检索唯一的数据.任何想法将不胜感激.

nsoperation nsoperationqueue ios

1
推荐指数
1
解决办法
551
查看次数