多线程处理objective-c

发布时间: 2016/10/2 2:00:03
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我要搜索数据库使用从 iphone 从键盘键入的关键字。 当我搜索关键局暂停。如果我在后台运行,然后我找到一个空数组。 我想这两个关键的板,键盘不会暂停,等待,直到数组是满数据。我使用的 objective-c


dispatch_semaphore_t task = dispatch_semaphore_create(0);

manager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {

    } else {
        //int i=0;
        //NSLog(@"%@",responseObject);

         header=responseObject;


        dispatch_semaphore_signal(task);

    }

}];

[dataTask resume];


dispatch_semaphore_wait(task, DISPATCH_TIME_FOREVER);
return header;

解决方法 1:

你已经采取了一种天生就是异步的方法, dataTaskWithRequest ,和已同步 (即它将阻塞调用的线程)。摆脱所有的信号量东西。它是真的坏的模式,不管怎么说。

我认为你这样做是因为你想要的 return 数据从一个网络调用。你不应该这样做。您应该使用完成处理程序模式例如


例如,假设您的方法,目前看起来像︰

- (id)performRequest:(NSURLRequest *)request {
    __block id header;

    manager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {

        } else {
            header = responseObject;
        }
        dispatch_semaphore_signal(semaphore);
    }];

    [dataTask resume];

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    return header;
}

你应该将其更改为 void 返回类型,并添加 completionHandler 参数︰

- (void)performRequest:(NSURLRequest *)request completionHandler:(void (^)(id _Nullable responseObject, NSError * _Nullable error))completionHandler {
    manager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {
            completionHandler(nil, error);
        } else {
            completionHandler(responseObject, nil);
        }
    }];

    [dataTask resume];
}

你会给它像这样︰

[self performRequest:request completionHandler:^(id responseObject, NSError *error) {
    // use responseObject and error here
}];

// but not here
官方微信
官方QQ群
31647020