Tag: multithreading

访问文本字段时,警告其他线程获取locking

我有一个名为_passwordTextField的UITextField ,我隐藏input: [_passwordTextField setSecureTextEntry:YES]; 每次我用passwordTextField.text访问字段的文本时,我都会看到这样的警告: void _WebThreadLockFromAnyThread(bool),0x9077460:从主线程或Web线程以外的线程获取Weblocking。 不应该从辅助线程调用UIKit。 我如何删除此警告?

我怎样才能避免在Xcode运行应用程序的情况?

当我在xcode中运行应用程序时,它总是显示下面的情况,我的应用程序在iphone模拟器被停止在视图中,我什么都不能做。可以任何人告诉我如何避免这种情况出现,谢谢。 这里是警告的代码。 (void)processCollision:(UIImageView *)bricks{ score+=10; scoreLabel.text =[NSString stringWithFormat:@"%05d" , score]; if (ballMovement.x>0&& bricks.frame.origin.x-ball.center.x<=4) { ballMovement.x=-ballMovement.x; }else if(ballMovement.x<0&&ball.center.x-(bricks.frame.origin.x+bricks.frame.size.width)<=4){ ballMovement.x=-ballMovement.x; } if (ballMovement.y>0&&bricks.frame.origin.y-ball.center.y<=4) { ballMovement.y=-ballMovement.y; }else if(ballMovement.y<0&&ball.center.y-(bricks.frame.origin.y+bricks.frame.size.height)<=4){ ballMovement.y=-ballMovement.y; bricks.alpha-=0.1; } }

由于等待,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: […]

在iOS中使用线程返回图像

嗨,我正在通过斯坦福大学iOS开发课。 我有一个关于线程的问题。 我知道UIKit调用应该由主线程来处理。 我想知道这样的事情是否合法? – (UIImage *)mapViewController:(MapViewController *)sender imageForAnnotation:(id<MKAnnotation>)annotation { FlickrPhotoAnnotation *fpa = (FlickrPhotoAnnotation *) annotation; NSURL *url = [FlickrFetcher urlForPhoto:fpa.photo format:FlickrPhotoFormatSquare]; __block UIImage *image; dispatch_queue_t downloadQ = dispatch_queue_create("download queue", NULL); dispatch_async(downloadQ, ^{ NSData *data = [NSData dataWithContentsOfURL:url]; if (data) { dispatch_async(dispatch_get_main_queue(), ^{ image = [UIImage imageWithData:data]; }); } }); dispatch_release(downloadQ); return image; } 或者我应该返回NSData并处理调用方法中的所有线程? […]

ios – 手动调用viewWillAppear()时出错(Objective-C)

我试图更新我的iOS应用程序的背景下的核心数据,我通过首先删除核心数据,然后将其添加回来。 但是,我需要某些function运行的时间段,但是当我尝试在后台执行所有操作时,这些function从不运行,除非我更改页面并返回到此页面。 所以我试图通过手动调用viewWillAppear()来解决这个错误,但是我得到以下错误。 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An instance 0x17191c00 of class CardScanView was deallocated while key value observers were still registered with it. Current observation info: <NSKeyValueObservationInfo 0x16d99c30> ( <NSKeyValueObservance 0x16dcdf20: Observer: 0x17191c00, Key path: verifyingCard, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x16d5db30> 发生错误的类中的方法: – […]

如果方法结束,只能继续循环

我有一个for/in循环,如下所示: for(NSString *paymentId in success){ [self getPaymentDetails:paymentId]; } getPaymentDetails方法是asynchronous的。 如果方法已经完成,我如何创build一个完成块来只继续for / in循环? 细节 getPaymentDetails方法如下所示: -(void)getPaymentDetails:(NSString *)paymentId{ PFUser *currentUser = [PFUser currentUser]; [PFCloud callFunctionInBackground:@"getpaymentdetails" withParameters:@{@"objectid": paymentId, @"userid": currentUser.objectId} block:^(NSDictionary *success, NSError *error) { if(success){ NSDictionary *payment = success; NSString *amount = [payment objectForKey:@"amount"]; if (![amount isKindOfClass:[NSNull class]]) { [self.amountArray addObject:amount]; } else { [self.amountArray addObject:@""]; } […]

主线程上的OAuthSwift请求callback

我用我的iOS应用程序使用swift 2.0写OAuthSwift(v 0.5.1)。 我使用Grand Central Dispatch在后台线程中运行一些代码。 这段代码使用OAuthSwift向服务器发出请求。 但是请求的callback在主线程上运行。 有没有一种方法可以在发送请求的同一线程上接收callback? dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)){ //Here run in background thread var client = OAuthSwiftClient(consumerKey: xxx, consumerSecret: yyyy) client.get(url, parameters:[:], headers: header_array, success:{(data, response)-> Void in //Success code here run on main thread }) { (error) -> Void in //Error code here } }

Swift:主界面冻结即使一切都在asynchronous线程? URLsession?

我仍然得到了asynchronous/后台线程的挂钩,但我不知道什么是这个调用。 基本上我正在build立一个播客播放器,在一个URLSession中从一个RSS feed中传输audiom4as。 我的问题是尽pipe把所有我能想到的,尤其是实际的AudioPlayerManager.shared.play(asynchronousfunc,UIbutton仍然冻结时,轨道是“初始化”,意思是试图播放。这是一个问题,因为它冻结整个应用程序,如果这些糟糕的连接,或者你有什么 – 这个UI挂起总是会发生,但是不同的时间,即使RSS提要没有时间parsing,没有挂起。 我正在使用GitHub库( https://github.com/tschob/AudioPlayerManager )来执行此操作。 这里是我每次查看(它的一个标签栏VC选项卡)出现的代码,它调用startup funcasynchronous: override func viewDidAppear(_ animated: Bool) { { //these should always happen, MUST BE in view did appear loadIndicator.isHidden = false overallNavigator.animateMediaBar(inPos: false) if(originalUrl != currentTrackUrl) //new m4a { print("NEW TRACK") trackStatus = .Initializing playModeStreaming = true } if(adURL == "" || adURL == nil) […]

核心数据多个线程 – 视图控制器不更新

我正在尝试在正在使用的应用程序中使用Core Data; 在应用程序委托中,此代码将启动从下载的JSON文件导入数据。 – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //setup app window, etc. BECDRefreshOperation *loadData = [[BECDRefreshOperation alloc] initWithStoreCoordinator:self.persistentStoreCoordinator]; [queue addOperation:loadData]; //queue is an NSOperationQueue return YES; } BECDRefreshOperation是运行导入的NSOperation的子类。 它创build了自己的托pipe对象上下文,以便将后者与后台进程分开。 – (id) initWithStoreCoordinator:(NSPersistentStoreCoordinator *)storeCoordinator{ if (![super init]) return nil; [self setPersistentStoreCoord:storeCoordinator]; return self; } – (void) main{ NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; [f setNumberStyle:NSNumberFormatterDecimalStyle]; […]

FileHandle.write线程安全吗?

我试图在我的应用程序中debugging一个难以捉摸的崩溃。 运行几分钟后,应用程序将停止与Message from debugger: terminated due to memory issue 。 没有堆栈跟踪。 我已经确定崩溃链接到将字节复制到UInt8数组中的一段代码。 相同的arrays可以在之前或之后立即写入文件系统。 我从悲惨的经历中知道,你不能从不同的线程向同一个数组读写数据。 它导致了一个非常像我正在经历的崩溃。 但是我在执行中一直非常小心。 将字节写入数组的代码以及从中读取字节的代码都在相同的串行DispatchQueue上运行。 但也许有另一个线程? 在FileHandle.write返回之前写入是否真的完成,还是有一些后台处理? func bug() { let bufferSize = … var fileHandle:FileHandle = … var fileIndex:UInt64 = … var bytes = [UInt8](repeating:0, count:bufferSize) fileHandle.seek(toFileOffset: fileIndex) fileHandle.write(Data(bytes)) for pos in 0..<bufferSize { bytes[pos] = … // Can my app crash […]