我正在尝试编写一个简单的iPhone应用程序,对应用程序沙箱中的文件内容进行一些修改。
我需要让这个过程变得懒惰。确保连续文件添加/修改操作的序列化也很重要。
我有这个方法:
#import "ProcessData.h"
#import <dispatch/dispatch.h>
@interface ProcessData ()
@end
dispatch_queue_t backgroundQueue;
NSLock *lock;
@implementation ProcessData
-(int)newEffects: (int) idNo : (NSString*) someData
{
[lock lock];
dispatch_async(backgroundQueue, ^(void)
{
@try
{
DiskAccess *dAccess = [[DiskAccess alloc] init];
//some operations here
[dAccess release];
}
@catch (NSException *exception)
{
}
@finally
{
printf("done with this stuff!");
}
})
[lock release];
}
@end
当我运行此代码时,应用程序会毫不客气地崩溃,我会看到这个:
0x1b1f2b5: cmpl $1, 36(%esi) Thread 1: EXC_BAD_ACCESS(code=2,address=0x24)
但是,如果我改变了行:
dispatch_async(backgroundQueue, ^(void)
以
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
......系统运行没有打嗝。
我想知道:
如何让我的后台队列工作。我在这做错了什么?
如果我使用 dispatch_get_global_queue ,如果有多个,则返回 要备份文件访问请求,我该如何确保操作 是按顺序进行的?
答案 0 :(得分:1)
我是否正确无法初始化backgroundQueue?您必须在使用之前初始化backgroundQueue。例如,添加代码
backgroundQueue = dispatch_queue_create(@"Background queue name", NULL);
并且只在那次电话之后
dispatch_async(backgroundQueue, ^{
//some code here
});
锁定也许是一个类似的错误。