Tag: 大中央调度

如何从后台线程返回数据?

我有一个方法,应该返回一个数组,这是一个后台线程填充。 我想等到return语句,直到数组完全填充。 我该怎么做? 我知道如何处理没有返回types的数据,但我想调用这个函数,并获得填充数组。 示例(这里数组结束为空,因为它在数组填充之前返回 – 我想做一些事情来返回填充的数组): -(NSArray*)fetchSomeArray{ __block NSArray *arrayToReturn; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) { NSArray *someArray = …; // getting some array from database arrayToReturn = [NSMutableArray new]; for(int i=0;i<someArray.count;i++){ [arrayToReturn addObject:…]; } }); return arrayToReturn; }

dispatch_async超时方法调用

在完成下面列出的漫长过程之后,是否有一个在设定的时间限制之后调用外部方法的好方法? 我想要一个漫长的过程,在设定的时间间隔后停止尝试,并调用一个方法来尝试别的东西,并结束请求。 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //// LONG PROCESS dispatch_async(dispatch_get_main_queue(), ^{ //// RESULTS PROCESS }); });

如何在iOS中在后台运行NSURLConnection

我正在与待办事项列表组织者的应用程序,用户添加注释。 我正在使用coredata数据库来存储笔记。 由于我提供同步function,我正在parsingJSON数据到服务器,并从服务器获取JSON数据。 我正在使用NSURLConnection API及其委托function – (void)pushData { loop through the notes array and send notes 1 by one [[request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:jsonData]; m_dataPush = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; [m_dataPush start]; } – (void)connectionDidFinishLoading:(NSURLConnection *)connection { Process response from server, save to core DB and again pushData if any modified and […]

可以__在自动变零的块中间吗?

在后台线程上运行的块中使用__weak self引用时,我只需要在开始时检查nil ,还是在第一个niltesting通过后执行期间, __weak self也可以变为nil? 我想在块中访问自己的一些Ivars,并且在块执行时我需要最新的值。

使用GCD的NSOperation,确保所有在同一个线程上

我有一个'并发' NSOperation ,在它的工作过程中,它使用了一些内部使用GCD的控制器类。 当这些控制器类返回完成块时,完成块位于另一个线程上。 我知道我可以将当​​前线程存储在操作启动方法中,然后运行performSelectorOnThread:但理想情况下,我想将完成包装在GCD块中,并在开始操作时将其分派到相同的线程中。 这甚至可能与GCD,因为我只能指定一个队列分派。 把这个工作带回到开始运行的同一个线程上的最好方法是什么? 除了我已经build议的,除非这是最好的方法。

如何将 Swift 2.0中的NSArray?

我已经创build了一个像这样的dispatch_block_t数组, let actions: [dispatch_block_t] = [ {self.pickImages()}, {self.takePicture()}] 现在,我想把这个[dispatch_block_t]转换成NSArray,这样我就可以把它传递给一个函数。 我已经尝试将此投影到NSArray。 let actionsArray: NSArray = actions as NSArray 但是我得到一个错误。 [dispatch_block_t]不能转换为NSArray 更新:完整的代码, import UIKit import Foundation import MobileCoreServices import MediaPlayer class AttachFilesViewController: UIViewController, UINavigationBarDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, MultiImagePickerControllerDelegate, MPMediaPickerControllerDelegate, UITableViewDataSource, UITableViewDelegate { var tableView: UITableView = UITableView() var imgPkr: MultiImagePickerController! //For picking image(s) var cameraPkr: UIImagePickerController = UIImagePickerController() […]

由于等待,dispatch_semaphore_signal从不被执行

我想拍两张照片,并希望它们按顺序运行。 捕获图片的方法是使用asynchronous运行的方法完成的。 我目前使用信号量试图同步这个,但它停止运行的程序。 我相信这是因为completionHandler在同一个线程上运行,并且由于线程被locking,它不能执行释放信号量。 这是我现在的代码: camera_sema = dispatch_semaphore_create(0); [photoOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { [flash turnOffFlash];//turning off flash for second picture //perform needed work dispatch_semaphore_signal(camera_sema); }]; dispatch_semaphore_wait(camera_sema, DISPATCH_TIME_FOREVER); 有没有一种方法,我可以使用dispatch_async这种情况下,或者在另一个后台线程上运行completionHandler的方式,以便能够执行? 更新1:这工作,但不知道,如果它是最好的办法做到这一点。 -(void*)method: (int) iteration { [photoOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { [flash turnOffFlash];//turning off flash for second picture //perform needed work //base case [method: […]

如何从GCD返回UIImagetypes

我有一个名为“ComLog”的“UIImage”返回types的方法。 我想从这个方法返回一个图像。 在“ComLog”方法中,我使用GCD从数组中获取图像值。 我使用下面的代码,“NSLog(@”qqqqqqqqqqq%@“,exiIco)”打印'图像'的值,但NSLog(@“qqqqqqqqqqqq%@”,exiIco);“不要这样的细节: -(UIImage*) ComLog { ExibitorInfo *currentExibitor100 = [[ExibitorInfo alloc] init]; currentExibitor100 = [self.exibitorsArray objectAtIndex:0]; imageQueueCompanyLogo = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(imageQueueCompanyLogo, ^ { UIImage *imageCompanyLogo = [UIImage imageWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[currentExibitor100 companyLogoURL]]]]; dispatch_async(dispatch_get_main_queue(), ^ { self.exibitorIcoImageView.image = imageCompanyLogo; exiIco = imageCompanyLogo; NSLog(@"qqqqqqqqqqq %@", exiIco); }); }); return exiIco; } – (void)viewDidLoad { [super viewDidLoad]; […]

大中央调度和function

我一直在看这个问题 ,试图解决我在这里的问题。 tl; dr是我想使用GCD让我在执行一些任务时显示“等待”屏幕,然后在完成时隐藏屏幕。 现在,我有 – (void) doStuff { // Show wait on start [self.waitScreen setHidden:NO]; dispatch_queue_t queue = dispatch_queue_create("com.myDomain.myApp",null); dispatch_async(queue, ^{ dispatch_async(dispatch_get_main_queue(), ^{ // Double nesting the dispatches seems to allow me to do UI changes as part of 'Code to execute' below. // If I do not double nest like this, the UI […]

即使在dispatch_async上,UILabel也不会更新

任何理由为什么我的标签不会更新? – (void)setLabel:(NSNotification*)notification { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"setLabel"); [self.label setText:@"My Label"]; }); } 我也尝试使用performSelectorOnMainThread无济于事。 请注意,setLabel出现在日志中。 附加信息: 我也有两个其他的function,只是用不同的文本做同样的事情。 另外两个函数没有dispatch_async,但都起作用。 另外,两个工作函数的通知是由NSURLConnection(本文中的方法#2)发送的。 虽然上面的非工作函数的通知是通过调用FBRequestConnection发送的(请参阅本文 )。 为了清楚起见,我的另外两个工作职能如下: – (void)setLabel2:(NSNotification*)notification { NSLog(@"setLabel2"); [self.label setText:@"My Label 2"]; } – (void)setLabel3:(NSNotification*)notification { NSLog(@"setLabel3"); [self.label setText:@"My Label 3"]; } 是的,我尝试删除我的代码中的dispatch_async。 事实上,原来没有dispatch_async,因为其他两个工作。