objective-c - 等待block完成再執行下一句程式碼
PHP中文网
PHP中文网 2017-04-22 09:00:22
0
1
599

我使用afnetworking發送一個post請求, 需要得到請求結果再執行下一步代碼,現在我用過如下兩種方式, 但都會造成程序卡住無法往下進行.但是我在另一個put請求用了相同的方法卻可行, 哪位大神有了解過這種問題的?求解釋

第一種: dispatch_semaphore_t

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[manager POST:@"http://172.16.100.85:8080/service/user/register" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    self.requestResult = ProtocolErrorSuccess;
    if ([responseObject isKindOfClass:[NSDictionary class]]) {
        self.responseData = responseObject;
    }
    dispatch_semaphore_signal(sem);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    self.requestResult = ProtocolErrorFailure;

    dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

if(self.requestResult == ProtocolErrorSuccess) {
    [self saveToken:self.responseData];
}

第二種: NSCondition

__block NSCondition *condition = [[NSCondition alloc] init];

[manager POST:@"http://172.16.100.85:8080/service/user/register" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    self.requestResult = ProtocolErrorSuccess;
    if ([responseObject isKindOfClass:[NSDictionary class]]) {
        self.responseData = responseObject;
    }

    [condition lock];
    [condition signal];
    [condition unlock];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    self.requestResult = ProtocolErrorFailure;

    [condition lock];
    [condition signal];
    [condition unlock];
}];

[condition lock];
[condition wait];
[condition unlock];


if(self.requestResult == ProtocolErrorSuccess) {
    [self saveToken:self.responseData];
}
PHP中文网
PHP中文网

认证0级讲师

全部回覆(1)
大家讲道理

你方法鎖住主執行緒能不卡住嗎? success或者failure的block不是讓你做下一步的事情的嗎?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板