46

Trong mã dispach_async của tôi block Tôi không thể truy cập global variables. Tôi gặp lỗi này Variable is not Assignable (missing _block type specifier).Không thể truy cập các biến toàn cầu trong dispatch_async: "Biến không thể gán được (thiếu thông số loại _block)"

NSString *textString; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
    (unsigned long)NULL), ^(void) { 
     textString = [self getTextString]; 
}); 

Bất kỳ ai cũng có thể giúp tôi tìm hiểu lý do không?

+0

Và điều này không liên quan gì đến Xcode. –

Trả lời

135

Bạn phải sử dụng specifier __block khi bạn thay đổi một biến bên trong một khối, do đó mã bạn đã nên giống như thế này thay vì:

__block NSString *textString; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
               (unsigned long)NULL), ^(void) { 
     textString = [self getTextString]; 
}); 

Blocks chụp trạng thái của các biến tham chiếu bên trong cơ thể của họ, vì vậy biến bị bắt phải được khai báo có thể thay đổi. Và tính đột biến là chính xác những gì bạn cần xem xét rằng bạn đang thiết lập cơ bản điều này.

+17

Xin lưu ý rằng có ** hai dấu gạch dưới ** trong '__block' –

+0

Nhưng giải pháp này vẫn vô ích - khối được thực thi một lần không đồng bộ. Vì vậy, ngay cả khi nó có thể gán cho biến cục bộ 'testString', ai có thể sử dụng nó? Điều duy nhất tôi có thể nghĩ ra nếu có một khối khác trong phạm vi này cũng sử dụng 'textString', có thể được thực thi sau này. – newacct

+0

Nếu không có bối cảnh xung quanh hoặc mã không phải là mã giả, bạn đã quyết định như thế nào? Đối với tất cả các bạn biết, OP có thể đã bỏ qua dispatch_group logic, hoặc có lẽ một số KVO 'sẽ/didChangeValueForKey:' các cuộc gọi trong khối. Điểm là: bạn đã bỏ lỡ điểm của câu hỏi. – CodaFi

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