首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

iOS AFNetworking異步請求:Block外獲取數據的正確姿勢

     編輯:程式設計疑難解答

問題現象

GET 請求在 success Block 內能拿到數據,Block 外 NSLog 打印 null,因網絡請求異步執行,Block 外代碼先於回調執行。

解決模式:回調傳遞 / 委託 / Promise

方案一:回調函數(最常用)

- (void)fetchWindDirectionWithCompletion:(void(^)(NSString *direction))completion {
    [manager GET:url parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
        NSString *dir = responseObject[@"winddirection"];
        if (completion) completion(dir);  // 回調傳出
    } failure:^(NSURLSessionTask *task, NSError *error) {
        if (completion) completion(nil);
    }];
}

// 調用處
[self fetchWindDirectionWithCompletion:^(NSString *dir) {
    NSLog(@"風向: %@", dir);  // 這裡安全使用數據
    [self updateUIWithDirection:dir];
}];

方案二:信號量同步(僅後台線程/測試用,主線程嚴禁)

dispatch_semaphore_t sema = dispatch_semaphore_create(0);
__block NSString *dir;
[manager GET:... success:^(...) { dir = ...; dispatch_semaphore_signal(sema); } ...];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); // 阻塞等待
NSLog(@"%@", dir);

最佳實踐原則

  • 拥抱異步:UI更新、數據持久化、頁面跳轉均在回調中進行。
  • 避免阻塞主線程:導致ANR/Watchdog殺進程。
  • 使用 NSOperationQueue / Combine / async/await (Swift 5.5+) 管理複雜依賴鏈。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved