我有一个方法,有时可以在我的代码中调用.下面是一个非常基本的示例,因为代码处理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) 我有一个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) 我有一堆NSOperations需要在队列中运行时创建和获取实体.
在NSOperations中创建实体时,我可以简单地使用默认上下文创建,或者因为我在不在主线程上的新线程中是不允许/建议的?如果我在这个线程上创建一个新实体,那么将它合并回默认上下文然后(而不是保存到商店)的最佳方法是什么?
在获取这些线程时,我需要获取然后更新该实体中的数据.我不知道如何做到这一点然后合并到默认上下文.
或者,当您保存时,您获取/创建的线程真的无关紧要?
我说上面的默认上下文,因为我有NSFetchedResultsControllers监视更新和插入的默认上下文.目前我的解决方案是在主线程上完成所有这些工作,但是应用程序现在开始爬行,现在正在通过它运行大量数据.
我还有一个类监控(通过KVO)操作队列计数.一旦它变为零,我就预先形成一个保存.我宁愿只在完成所有上述NSOperations后执行,就像我现在正在执行的那样.感谢您的帮助.
core-data nsoperation nsmanagedobjectcontext ios magicalrecord
我一直在搜索,但只能找到委托模式的想法来传递来自NSOperation的数据.我有一个NSOperation,在完成NSOperation后下载数据我希望它能够传递给将它下载的数据放入NSoperationQueue的类.在我的队列中最多可以有100个这样的NSOPerations,它们都检索唯一的数据.任何想法将不胜感激.