天天看點

Block 部分使用注意事項

block使用步驟

  • 确定block的類型
  • 确定block的代碼
  • 回調block
  • __block 是為了把對象的位址傳到 block 中,因為 block 塊有可能在任何線程中執行,有可能無法找到上面的對象

應用舉例

//定義在 block 之外的類
    __block NSArray* result = nil;

    //在全局隊列中異步執行--有可能在任何非主線程
    dispatch_async(dispatch_get_global_queue(, ), ^{

        //此處如果 result 定義時未用__block 修飾,則會報錯,因為如果目前 block 有可能在其他線程執行
        //是無法看到該對象的
        result = [NSArray array];
    });
           
  • block作為參數的時候,不需要寫 block 的變量名
  • 例如: -(void)testBlock: ( void ( ^ ) ( ) ) myBlock
    • 事例代碼
- (void)test
    {
        //定義要傳入的 block
        void (^myblock)(NSString*) = ^(NSString* str) {
            NSLog(@"傳入的字元串是:%@", str);
        };

        [self testBlockWithBlock:myblock];
    }

    - (void)testBlockWithBlock:(void (^)(NSString* string))block
    {
        //調用傳入的 block
        if (block) {
            block(@"hello world");
        }
    }