2012-04-05 31 views
9

Tôi hơi mới mẻ đối với các khối và cần trợ giúp. Tôi muốn lưu trữ một khối trong một NSDictionary và thực hiện khối nói khi nó được truy cập dựa trên key của nó. Đây là những gì tôi có cho đến nay là một ví dụ.Làm cách nào để thực thi các khối được lưu trữ trong NSDictionary?

NSDictionary *blocks = [NSDictionary dictionaryWithObjectsAndKeys: 
           ^{NSLog(@"Log Block 1");}, @"Block1", 
           ^{NSLog(@"Log Block 2");}, @"Block2", 
           nil]; 

Tôi sau đó liệt kê thông qua từ điển bằng cách sử dụng keyEnumerator. Tôi biết khối đang được lưu trữ đúng cách vì tôi gọi NSLog(@"%@", [blocks objectForKey:key]); trong quá trình liệt kê và nhận được <__NSGlobalBlock__: 0x100003750>. Vì vậy, tôi biết tôi có thể truy cập nó nhưng làm thế nào tôi có thể thực hiện nó vào thời điểm này?

Trả lời

15

Hãy thử điều này:

void(^myAwesomeBlock)() = [blocks objectForKey:key]; 
myAwesomeBlock(); 
+0

Cảm ơn, điều này đã hiệu quả đối với tôi. Tuy nhiên, tôi nhận thấy rằng khi các cuộc gọi tiếp theo được thực hiện cho mỗi khối, nó sẽ trả về cùng một thông tin như khi nó được thực thi đầu tiên thay vì bao gồm bất kỳ thứ gì có thể đã thay đổi kể từ đó. Có cách nào để làm cho nó thực thi mỗi lần nó được gọi thay vì trả lại thông tin gốc? – sud0

+2

Nó thực hiện mọi lúc, nhưng nó nắm bắt các biến bên ngoài khi nó được sao chép, thay vì khi nó được thực hiện. –

0

Bạn cần phải cast:

id bar = [blocks objectForKey:@"Block1"]; 
((void(^)())bar)(); 
4

tôi nhận thấy, mặc dù, rằng khi cuộc gọi tiếp theo được thực hiện đến từng khối nó sẽ trả về thông tin tương tự như khi nó được thực hiện đầu tiên thay vì bao gồm bất kỳ thứ gì có thể đã thay đổi kể từ đó. Có cách nào để làm cho nó thực thi mỗi lần nó được gọi thay vì trả lại thông tin gốc?

Tham khảo tài liệu về khối, đặc biệt là phần hưởng Types of Variable:

Các quy tắc sau áp dụng cho các biến được sử dụng trong một khối:

  • Stack (không tĩnh) biến cục bộ với phạm vi từ vựng kèm theo được ghi lại dưới dạng biến số const.

    Giá trị của chúng được lấy tại điểm biểu thức khối trong chương trình. Trong các khối lồng nhau, giá trị được chụp từ phạm vi bao quanh gần nhất.

  • Biến cục bộ thành phạm vi từ vựng kèm theo được khai báo với công cụ sửa đổi bộ nhớ __block được cung cấp theo tham chiếu và do đó có thể thay đổi.

    Mọi thay đổi được phản ánh trong phạm vi từ vựng kèm theo, bao gồm bất kỳ khối nào khác được xác định trong cùng phạm vi từ vựng kèm theo. Chúng được thảo luận chi tiết hơn trong “Loại lưu trữ __block.”

Các vấn đề liên quan