异步调度队列触发错误

时间:2013-04-22 09:51:31

标签: ios objective-c multithreading

我正在尝试编写一个简单的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 ,如果有多个,则返回     要备份文件访问请求,我该如何确保操作     是按顺序进行的?

1 个答案:

答案 0 :(得分:1)

我是否正确无法初始化backgroundQueue?您必须在使用之前初始化backgroundQueue。例如,添加代码

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

并且只在那次电话之后

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

锁定也许是一个类似的错误。