Tag: asynchronous

如何将代码块分派到iOS中的同一线程?

问题的主要方面:关于iOS。 我可以以某种方式派发代码块,他们将(a)在后台运行,(b)在同一个线程中运行? 我想在后台运行一些耗时的操作,但是这些操作必须在同一个线程上运行,因为它们涉及资源,不能在线程之间共享。 进一步的技术细节,如果需要的话:这是关于为Apache Cordova实现一个sqlite插件,这是一个移动平台上的HTML5应用程序的框架。 这个插件应该是Cordova的插件API中的WebSQL的一个实现。 (这意味着,不可能将整个事务包装在单个块中,这样可以使一切变得更容易)。 以下是Cordova文档中的一些代码: – (void)myPluginMethod:(CDVInvokedUrlCommand*)command { // Check command.arguments here. [self.commandDelegate runInBackground:^{ NSString* payload = nil; // Some blocking logic… CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload]; // The sendPluginResult method is thread-safe. [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; } 但据我所知,不能保证,那些派发的代码块(请参阅runInBackground )将在同一个线程上运行。

iOS SDWebImage淡入新图像

我一直在我的iPhone应用程序上使用SDWebImage来处理所有的图像加载。 我正在使用一个占位符图像,并且在加载后我想淡入或淡入新图像。 我正在使用成功块来设置图像,它工作的很好。 不pipe我尝试什么,图像都不会褪色。 我已经尝试将animation代码发送回主线程,但是这也没有帮助。 它只是立即加载…没有animation。 这是我的代码。 有什么想法吗? // load placeholder image NSURL *url = … _imageView = [[UIImageView alloc] init]; [_imageView setImage:[UIImage imageNamed:@"loading.jpg"]]; // request image SDWebImageManager *manager = [SDWebImageManager sharedManager]; [manager downloadWithURL:url delegate:self options:0 success:^(UIImage *image) { [UIView transitionWithView:_imageView duration:3.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [_imageView setImage:image]; } completion:NULL]; } failure:nil];

dispatch_async UIWebView的loadrequest

我正在加载一个在我的应用程序的JavaScript,脚本将尝试find一个解决scheme,这可能需要一些时间。 我不想等待超过5秒的解决scheme,在这种情况下,我只是想停止请求,并显示一条消息给用户。 我一直试图用NSTimers和dispatch_async来完成,但UIWebView请求仍在使用我的整个主队列,而NSTimer在此期间停止了,等待答案。 请求调用: webViewUIView.delegate = self var path = NSBundle.mainBundle().pathForResource("page", ofType: "html") var url = NSURL(fileURLWithPath: path!) var req = NSURLRequest(URL:url!) var queue = NSOperationQueue() dispatch_async(dispatch_get_main_queue()) { println("********CALLING TO LOADREQUEST") self.webViewUIView.loadRequest(req) } 而我的NSTimer: var timer2 = NSTimer() func webViewDidStartLoad(webView: UIWebView) { println("********Creating the Timer") let aSelector : Selector = "cancelWeb" self.timer2 = NSTimer.scheduledTimerWithTimeInterval(5, target: […]

NSTimer不会失效

我有一个问题,使我的计时器无效。 @property (nonatomic, strong) NSTimer *timer; 在我的成功块内,我正在主线程上分配和设置我的计时器: dispatch_async(dispatch_get_main_queue(), ^{ self.timer = [NSTimer scheduledTimerWithTimeInterval:[Config refreshInterval].integerValue target:self selector:@selector(methodThatHasABlockCalledMentionedAbove) userInfo:nil repeats:NO]; }); 在我的textFieldDidBeginEditing我无效我的计时器是这样的: dispatch_async(dispatch_get_main_queue(), ^{ [self.timer invalidate]; self.timer = nil; }); 我的方法仍然在计时器上执行。 有什么收获?

从asynchronousWeb服务响应更新托pipe对象的最佳方法?

我有一个NSManagedObjectContext关联到主线程( mainContext ),在那里我获取我显示整个应用程序的所有NSManagedObject 。 用户不要编辑这些对象,但我从Web服务获取更新。 我定期对这些服务执行asynchronous调用,并且“告诉”我要删除哪些pipe理对象(如果有的话),哪些必须用新信息更新(如果有的话),以及是否需要插入新的对象。 所以,我需要首先获得所有服务的响应,然后检查我必须对我的mainContext已有的托pipe对象所做的更改。 而且我还需要执行更新以避免阻止UI。 我正在考虑两种方法来pipe理这种情况: 在私有队列中使用一个完全独立的privateContext和它自己的核心数据栈来插入所有从服务中获得的对象。 然后以某种方式(如何?)与mainContext的对象进行比较,并删除/修改/插入mainContext对象。 在专用队列中使用privateContext ,但是作为mainContext的子mainContext 。 然后,我需要传递子对象的父对象mainContext中的对象(这是可能的?如何?),同时在这个子对象中插入从服务获得的对象,然后比较和执行更改。 哪些方法是最好的或适当的? 或者,也许应该是一个我没有想过的不同的? 提前致谢 编辑:这可能是另一种可能的方式? 只使用mainContext ,而我正在parsing服务的响应,而不是创build新的对象,只需要在mainContext逐一进行更改… 编辑2:另一种可能性? 只有使用privateContext ,获取服务响应并创build新的对象。 然后,也可以用这个privateContext获取所有已经存在的对象(和mainContext的对象一样)。 在这个privateContext比较两组对象(最近创build的服务和获取的),保存此上下文,清除mainContext并重新获取mainContext所有对象。

iOS – asynchronous图像下载

我正在写一个应用程序,它将在UIImageView中显示在我的服务器上find的图像。 我需要的东西,将asynchronous下载图像,并将其caching在UIImageView中。 按下button时,下载也需要被取消。 任何人都可以指向我可以做到这一点的方向吗?

如何在iOS中asynchronous下载多个图像,而不影响UI?

我有100个url,我想下载所有这些图像并保存在文档中。 为了节省我已经做了,也可以做懒加载,但我无法用最less的时间下载所有的graphics用户界面不应该挂起。 这样做有什么合适的方法? 谢谢

在函数外使用来自Alamofire请求的值

我似乎无法弄清楚这一个:我试图从我的服务器(在JSON中)使用Alamofire请求的错误,但我不能得到该函数以外的值。 这是我的function的实现: func alamoRequest(username : String, email: String, password: String, facebook: String, completionHandler : (String?) -> Void) { var jsonValue : JSON? let URL = "http://someurl.com/login.php" let requestParameters = ["username" : username, "email" : email, "password" : password, "facebook" : facebook, "date": NSNull()]; var jsonString : String = String() Alamofire.request(.GET, URL, parameters: requestParameters).validate().responseJSON { response […]

如何在asynchronous块内为dispatch_group_async调度dispatch_group_wait

我有这样的代码: [SVProgressHUD show]; [imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, …) { dispatch_group_async(queueGroup, queue, ^{ // Do stuff }); }]; dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER); [SVProgressHUD dismiss]; 基本上,显示加载animationHUD,并开始从资产生成图像缩略图,然后一旦隐藏HUD。 我正在使用一个调度组,因为我想确保在隐藏HUD之前生成所有的缩略图。 但是当我运行它时,HUD立即被解雇。 我猜这是因为generateCGImagesAsynchronouslyForTimes: completionHandler:的asynchronous性质generateCGImagesAsynchronouslyForTimes: completionHandler: – dispatch_group_wait在completionHandler中的第一个dispatch_group_async之前被调用。 解决这种情况的优雅方法是什么? 谢谢。

在iOS中使用进度报告取消一组asynchronous操作

假设我使用另一个SDK(我没有控制权)与asynchronous导入1个文件的API,并在完成时调用完成callback。 以下是一个示例API。 func importFile(filePath: String, completion: () -> Void) 我需要使用此API导入10个文件(一个接一个),但我需要它是可取消的,例如,在成功导入文件1,2,3后,导入文件4时,我希望能够取消整个操作(导入10个文件),这样文件4将完成(因为它已经开始),但是文件5-10不会被导入。 另外,我还需要汇报import情况。 当文件1导入成功时,我应该报告10%的进度(十分之一已经完成)。 我怎样才能做到这一点? 我正在考虑使用NSOperationQueue和10个NSOperations,但是进度报告似乎很难。