2013-06-20 51 views
46

AFNetworking是否調用主線程上的完成塊?或者它是否在後臺調用,需要我手動將UI更新發送到主線程?在主線程上調用AFNetworking成功/失敗塊嗎?

使用代碼來代替的話,這是從AFNetworking documentation與調用NSLog示例代碼由UI更新替代:

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    self.label.text = JSON[@"text"]; 
} failure:nil]; 

它應該被寫成這樣?

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.label.text = JSON[@"text"]; 
    }); 
} failure:nil]; 
+0

@tdarr所有的源代碼都可用,看看,你可以知道這一切 – onmyway133

回答

24

在AFNetworking 2中,AFHTTPRequestOperationManager有一個completionQueue屬性。

請求操作的completionBlock的調度隊列。 如果NULL(默認),則使用主隊列。

#if OS_OBJECT_USE_OBJC 
    @property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; 
    #else 
    @property (nonatomic, assign, nullable) dispatch_queue_t completionQueue; 
    #endif 

在AFNetworking 3,completionQueue屬性已被移動到AFURLSessionManager(其AFHTTPSessionManager延伸)。

調度隊列爲completionBlock。如果使用NULL(默認),則使用 主隊列。

@property (nonatomic, strong) dispatch_queue_t completionQueue; 
@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; 
+3

這應該被接受的答案! – XeNoN

+0

我同意!我編輯了包含AFNetworking 3的答案,並添加了兩個版本的源代碼鏈接。 – thomasd

+0

@ thomasd謝謝。你的編輯有一些拒絕,所以我不能接受它,但我只是複製它。 – onmyway133

41

調用它們的主隊列,除非你明確地設定了AFHTTPRequestOperation隊列,如圖setCompletionBlockWithSuccess:failureAFHTTPRequestOperation.m

self.completionBlock = ^{ 
    if (self.error) { 
     if (failure) { 
      dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ 
       failure(self, self.error); 
      }); 
     } 
    } else { 
     if (success) { 
      dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{ 
       success(self, self.responseData); 
      }); 
     } 
    } 
}; 
+0

謝謝!我想我可以讀的來源... – thomasd

+0

不知道大概應該已經檢查,而不是假設他們只是執行他們在同一線程作爲請求 –

5

正如每個人解釋,這是在AFNetworking的源代碼,爲做到這一點的方式,

AFNetworking 2.xx的:

// Create dispatch_queue_t with your name and DISPATCH_QUEUE_SERIAL as for the flag 
dispatch_queue_t myQueue = dispatch_queue_create("com.CompanyName.AppName.methodTest", DISPATCH_QUEUE_SERIAL); 

// init AFHTTPRequestOperation of AFNetworking 
operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

// Set the FMDB property to run off the main thread 
[operation setCompletionQueue:myQueue]; 

AFNetworking 3.xx

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 
[self setCompletionQueue:myQueue];