2013-04-22 94 views
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) 

TO

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) 

......系統運行時沒有呃逆。

我想知道:

  1. 如何讓我的背景隊列工作。我在這裏做錯了什麼?

  2. 如果我使用dispatch_get_global_queue,如果有多個,回來 備份文件訪問請求,我怎麼能保證操作 依次進行?

回答

1

我是不是你初始化backgroundQueue無處?在使用它之前,您必須初始化backgroundQueue。例如只有呼叫

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

也許類似的錯誤與鎖之後添加代碼

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

和。

+0

工作。非常感謝。但是,鎖沒有問題。鎖按原樣工作。 – metsburg 2013-04-22 10:07:51