0

我正在尝试编写一个简单的 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)

...系统运行没有打嗝。

我想知道:

  1. 如何让我的后台队列工作。我在这里做错了什么?

  2. 如果我使用dispatch_get_global_queue并且如果有多个背靠背文件访问请求,我如何确保操作按顺序执行?

4

1 回答 1

1

我对你初始化 backgroundQueue 无处吗?您必须在使用前初始化 backgroundQueue。例如添加代码

    backgroundQueue = dispatch_queue_create(@"Background queue name", NULL);

只有在那通电话之后

    dispatch_async(backgroundQueue, ^{
        //some code here
    });

可能与锁定类似的错误。

于 2013-04-22T10:01:17.943 回答