1

我想問一個關於表視圖和@synchronized構造的問題。 我必須執行didSelectRowAtIndexPath裏面的代碼一次,即使用戶不斷點擊表格單元格...同步訪問UITableViewDelegate邏輯

我有一個表格用作遊戲中的菜單。我想提供對didSelectRowAtIndexPath中實現的邏輯的同步訪問。

我又寫道下面的代碼:

//condition = YES in init code 

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     @synchronized(self) 
     { 
      if(!condition) 
      { 
       NSLog(@"multiple execution is not allowed..."); 
       return; 
      } 
      condition = NO; 
      ... 
      //code 
      ... 
     } 
    } 

我與iOS 4.3.4測試它在我的IPONE 3GS和工作(我做了測試,並如預期的行爲),但我的客戶測試了他的3克與ios 3.x安裝,它似乎不工作。

我想在使用GCD(通過在dispatch_once()中包含代碼),但它從ios 4.x開始支持。

對於@synchronized爲什麼@synchronized在我的客戶手機上不起作用,您有沒有任何見解?

謝謝!

回答

0

@synchronized在這裏不應該不需要。

  • 你可以期待委託調用是從主線程(假設你不調用它)。
  • dispatch_once似乎是一個不尋常的選擇。如果你確定它是好的,請嘗試對iOS 3使用pthread_once。這很奇怪,因爲它使用可變全局狀態進行操作。 IOW,「我只想做一張桌子」。
  • 測試BOOL速度很快。

我的猜測是?您的表正在被刪除(查看卸載),並且可能無法在重新加載時重新創建。

+0

謝謝你的回答。我想過使用dispatch_once來找到一種方法來執行一次與錶行關聯的代碼。我通過在didSelectRowAtIndexPath實現中設置了一個斷點來驗證問題,並且在斷點處停下來時,我再次敲入另一個線程,並進入了didSelectRowAtIndexPath,因此我發現自己的競爭條件。 – notsoux

+0

嗯......不知道該說什麼如果你確定只從主線程調用它。你有機會*禁用* objc或C++異常?如果是這樣,請嘗試啓用它們。通常情況下,我只是將邏輯推出到一個單獨的方法。否則,程序的其他部分可能不是線程安全的,或者您可能正在以非常規方式進行初始化和銷燬​​。 – justin