iOS AFNetWorking中block執行完后再執行其它操作


需求:同時進行兩次網絡請求,網絡請求是異步的,在網絡請求成功后進行其它的操作。兩個網絡請求是這樣,一個網絡請求中block執行完之后,再進行其它操作,也是一樣的原理,只是這時候不需要線程組了,只需要信號量。當然也適用於所有的block。

接下來就說下,在兩次異步請求之后要做的操作。

利用線程組和信號量來完成,看代碼

- (void)getData
{
    NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04";
    NSString* urlString_1 = @"http://api.openweathermap.org/data/2.5/weather";
    NSString* urlString_2 = @"http://api.openweathermap.org/data/2.5/forecast/daily";
    NSDictionary* dictionary =@{
                                @"lat" : @"40.04991291",
                                @"lon" : @"116.25626162",
                                @"APPID" : appIdKey
                                };

    // 創建隊列組,可以使兩個網絡請求異步執行,執行完之后再進行操作
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        // 創建信號量
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
        AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
        [mgr GET:urlString_1 parameters:dictionary progress:^(NSProgress * _Nonnull downloadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            // 請求成功發送信號量(+1)
            dispatch_semaphore_signal(semaphore);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            // 無論請求成功或失敗都發送信號量(+1)
            dispatch_semaphore_signal(semaphore);
        }];
        
        // 在請求成功之前等待信號量(-1)
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        // 創建信號量
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
        
        AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
        [mgr GET:urlString_2 parameters:dictionary progress:^(NSProgress * _Nonnull downloadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            // 發送信號量
            dispatch_semaphore_signal(semaphore);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            // 發送信號量
            dispatch_semaphore_signal(semaphore);
        }];
        // 在請求成功之前等待信號量
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    });
    
    // 請求完成之后
    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
    });
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM